Assuming that you don't need procedure B to run in the same session as A, you can schedule the job to run asynchronously, i.e.
CREATE OR REPLACE PROCEDURE a( p_cur_out OUT SYS_REFCURSOR )
AS
l_jobno pls_integer;
BEGIN
OPEN p_cur_out
FOR SELECT cast( null as varchar2(64) ) empname,
cast( null as integer ) empid
FROM dual;
dbms_job.submit( l_jobno,
'BEGIN B(); END;' );
commit;
END a;
You'll return from A and a job will be scheduled immediately to run procedure B in a separate session (note that the job won't start until the current session commits which is why I added a commit here-- if your code is going to commit elsewhere, you can eliminate that). All dbms_job.submit is doing is creating the job-- the job will not start executing until after the procedure returns.
If B takes arguments, you'll need to build the PL/SQL block dynamically. So if B takes two NUMBER parameters
CREATE OR REPLACE PROCEDURE a( p_cur_out OUT SYS_REFCURSOR )
AS
l_jobno pls_integer;
l_param1 pls_integer;
l_param2 pls_integer;
BEGIN
OPEN p_cur_out
FOR SELECT cast( null as varchar2(64) ) empname,
cast( null as integer ) empid
FROM dual;
dbms_job.submit( l_jobno,
'BEGIN B(' || to_char( l_param1 ) || ', ' ||
to_char( l_param2 ) || '); END;' );
commit;
END a;