I found this exchange from a month ago that describes my problem and a suggested solution:
I was hoping that the instanceID was a unique way to identify a PV. My approach was check the chain of copy numbers the first time each PV is encountered in my UserSteppingAction() and to store the instanceID as the key in a map for easy checking of future events.
Unfortunately, it seems each PV does not get a unique ID. In fact it seems the PV instances are not stored individually by GEANT4. So it is necessary to follow the stack of nested volumes by using (for example) touchable_handle->GetVolume(stack_level) and checking the copy number of all the parent volumes
I will shift any further discussion over to the previous thread.