As far as IMS is concerned, there is no main program vs a subprogram. So any calls you make in the main program will affect the PCB the exact same as if you coded them in the subroutine.
For example, I can do a GU in the main program, then call the subroutine with the PCB. The subroutine can then do a GN without having to re-do the GU call against that same PCB. This works because you are passing pointers to the PCB in the linkage section of the main program.
I'm guessing a little bit here, but it sounds like you are asking about making different level calls using the same code. I can tell you that there is an optional parm in the CBLTDLI interface that tells IMS how many parms you intend to pass. It will SOMETHING like this:
CALL 'CBLTDLI' USING WSP-DLI-PARM-COUNT
WSP-DLI-FUNCT WGPC02RI-PCB
WSP-IO-AREA
WSP-SSA-LEVEL-1 WSP-SSA-LEVEL-2
WSP-SSA-LEVEL-3 WSP-SSA-LEVEL-4
WSP-SSA-LEVEL-5 WSP-SSA-LEVEL-6
WSP-SSA-LEVEL-7 WSP-SSA-LEVEL-8
Notice that first parm? It will contain a decimal number telling IMS how many parms you want to pass. So if you only have one SSA, you put a 4 in there. That gets the function, the PCB, the I-O area, and the first SSA. If you go to three levels, put a 6 in there.
You can build the SSAs anywhere. They just need to be there for the CBLTDLI call. So you can build them in subroutine or pass them from main program.
As for pros/cons, that's a complex answer. I think the biggest factor is WHY you want to separate them.
If you don't want programmers to have to know "how do I find the list of accounts held by customer x". Then you are putting the business logic in the subroutine. It will need to take a customer id and do all of the calls needed to build the list of accounts, then pass that list back to the main program. That gets into some "object oriented" thinking, where you are basically writing data retrieval functions. Each function will need it's own interface.
If you are just writing a bare bones IMS calling routine so that "developers don't have to know IMS," then it's probably a bad idea. Each developer will still need to know how the data is structured, and how to call the new subroutine. All of the same error checking has to occur too.
So...the short answer is that it depends.