I have done this process many times. Would you believe that I, just yesterday, did a similar thing on a library of over 1400 programs, and the entire process took about 8 minutes.
The first step is to identify all file handles that the file is opened to. To do this, go into the ALLBP list in LIST.EDIT. If you don't know about the ALLBP command, type 'HELP ALLBP'. Do an LX for all opens of the file, i.e., LX 'PM'|"PM". This should give you all opens except in the case that the file names are in variables. In this case, use 'LX OPEN', then pare down the list to the desired file. Clean up the list using the REMOVE and SUBLIST functions of LX and deleting unwanted lines.
When the list is cleaned up, type EL to edit the LX display. Set the entire record into "modify" mode using the MALL command. Then peel off all extraneous text in each line by using the DU and DA commands. The first time, type 'DU+ TO ', confirm 'A'. This will delete all text up to and including the 'TO '. Type DA+ then 2 spaces, confirm 'A'. This will strip off all trailing text. Hit return to exit mod mode. Type R1 to set the sort to delete dups, then type SORT. The dups will be deleted as the handles are sorted. You now have a list of all file handles that are opened.
When you have the list of all file handles, then do an LX for the reads, i.e., LX FROM PM|FROM F.PM|FROM PM.FILE. When the display comes up you will have every read from the desired file, regardless of what file handle it is opened to. Your next step is to determine every variable that the file is read into.
Type EL to edit the LX display. Set the entire record into "modify" mode using the MALL command. Then peel off all extranoeus text in each line by using the DU and DA commands. The first time, type DU READ, confirm 'A'. This will delete all text up to READ. Then type DU+ then 2 spaces, confirm 'A'. This will delete up to and including the first space. This will strip off the reads, leaving you with a list of all the record variables followed by other text. Type DA+ then 2 spaces, confirm 'A'. This will strip off all trailing text. Hit return to exit mod mode. Type SORT. The dups will be deleted as the vars are sorted. You now have a list of all variables that are read.
Append the desired attribute to the list of vars by typing MALL, then 'A <##>', confirm 'A'. Hit return to exit mod mode. Save that list by typing 'SAVE give.it.a.name'. Exit out of all levels until you are in LIST.EDIT in the ALLBP list of programs. Type 'SRCH' to bring up the sophisticated search routine. In the line for strings to be searched for, enter 'LIST give.it.a.name', enter in any exclusions, and a result list name. This command will search the entire ALLBP list for all the VAR<##>'s you have isolated, simultaneously.
The resulting list is a list of every program that touches the desired attribute by specific reference. You can now begin to look at code to see what has to be changed.