Seems like this might be a better job for an app: choose a device, then set a "last replaced" date for it or whatever fields you want. The Xiaomi community driver has something like this built-in but it gets cleared anytime you re-pair the device (even if it's left in the hub database and gets reinitialized as the same device as Zigbee does), probably due to the way the driver methods are written but still not necessarily something that needs to be handled at the driver level anyway. You could even configure the app to notify you after so many months or weeks or whatever for each device.
Me, I just write the date of battery installation on the batteries themselves, which obviously doesn't help me be proactive in any way (just helps me see if something is draining--or rather has drained--faster than I'd expect), but I couple this with Device Watchdog to see if it actually stops responding, often before I notice problems myself. Also not proactive, but it usually helps me be reactive fast enough.
Despite my workarounds, this seems like a nice idea.
After having a few sensors not report for months and not knowing, now this app runs an activity report daily on all battery devices and sends a pushover notification, that you can verify that activity has occurred within the last 24 hours. If one device doesn't report in 24 hours I change the battery. As I have many devices that are either at 1% for months now still working, or devices that have been at 100% for months now and the battery % never changes.
@veeceeoh put this into his drivers for the Xiaomi/Aqara devices. Very convenient. I've been meaning to put in a similar request. It's a button in the device page that just sets the date and time when pressed. I have a list of them as well but always forget to update it.