Win32::OLE objects aren't copies of the foreign objects. If they were copies, you couldn't affect the remote objects. Each Win32::OLE object is an interface to a remote objects.
Any fetch from the referenced hash results in a get from the remote object.
Any change to the referenced hash results in a set in the remote object.
And yes, you are doing repeated fetches.
I suspect I'm not understanding how Data::Dumper works.
It works much like your code, except it doesn't print anything. The output is placed in a string, which is returned when it's done.