The problem is, with offset tables, they change themselves without notice if you are not careful. Before I get cries of "Oh No" let me say that they change because the operator has done something (not literally by themselves)
The particular one that always catches me out (although not recently) is zeroing the DRO's in Program Co-ordinates, after I have zeroed the machine in Machine Co-ordinates.. The thing being, after you have zerod your machine in Machine Co-ordinates NOT to then zero the Part co-ordinates unless the machine is at 0.0.0, otherwise the selected offset is altered to reflect the current offset of the machine.
The machine then seems to work fine for the first cut, but when it then changes to a different offset, the second offset was not in the proper relationship to the first offset (if you get my meaning).
Your problem, however, does not appear to be that - from what you say, the machine is suddenly changing its program. As you know, Mach3 reads ahead, and it appears, correct me if I am wrong, otherwise we are looking in the wrong place, that the machine is gaily returning to base, job done, then Mach3 reads ahead, sees another sub-routine call, and picks the wrong one and starts on that.
I assume you are using mach3 in the normal way, the main program being in the GCode file and Sub-routines being in the Sub Routines file under a seperate name.
I would be tempted to do a little housekeeping on my computer, behaps run a Disk Clean Up and a Defragmenter so that all the loose ends of files are properly tied up.
I don't know what else to suggest at the moment.
Jim.