I think there are no such callbacks which alert you when names change or properties change. Which is a problem in so many ways… Properties are entirely “polling” by nature. There values are only ever pulled by other pieces of code, and don’t have a signalling mechanism. They have something the Python/C binding refers to as callbacks, but they are just setters and getters. You could theoretically implement your own property, and then have some signalling of your own in setters/getters.
Another way to work around this problem is to use the in-memory addresses. For better or for worse, most blender data objects have an “as_pointer” method, which returns the in-memory address. This address does not change during the lifetime of the loaded blend data, regardless of changing the name. So you could try to keep a cache of pointers and names and thusly notice when a pointer gets a new name. If you want to totally abuse the Blender API, you can even do that check inside the event method of a modal operator…
These lack of modern paradigms is one of the reasons why I call Blender a “living fossil”. Blender is a great, mature piece of software, but some of the paradigms are just awfully dated. And it would be hard or impossible to change that, too.
Another solution is to add a custom property “unique id” which is set once and never changed, so that it is saved in the blend file. It’s unfortunate that the Blender API never thought of that.
I have been thinking about how to store arbitrary data in blend files, when the “property system” just isn’t enough. One solution I came up with is to serialize the data to json and store it in either a Text object or a custom property. I haven’t tried it, but it should work.
You might find it interesting to store data (possibly JSON-encoded) as a Blender Text datablock. If you prefix the name with a dot, it will be treated as hidden (not show in UI, but still accessible via bpy.data.texts)