first to clarify – “mainframe” is z/OS. If not, then the following may not apply.
Dynamic allocation aside, the module (called or main) that defines the file and opens it and closes it really needs to be the one that reads it.
In order to have 2 different modules operating on the file will require that the DCB (or in COBOL terms the “FD”) be passed as a parm between the 2 different modules. ( I am sure you are away that when I say “passed as a parm” what is really happening is that the ADDRESS of the parm is passed and made available to the called module.)
Passing the address of “FD” is the only way the two modules will be able to operate on it.
Different versions of COBOL (especially OLD ones) can pass all sorts of things as parms in a call. (I remember one COBOL module that actually passed COBOL paragraph names to the called module and the called module could return to different locations in the calling module. WOW. But I think that went away when we moved off of COBOL 74.) All you can do is try to pass the required information from module to module.
But I think I would try to find a way to put it all in one module.