As far as I have seen, they mostly update based on need: if the reported value changes, then they send a message, otherwise they fall back to time intervals.
Depends on the device, some it could be once a day. On mine, currently, I have one device that hasn’t reported in for 2 hours (it’s a Zigbee remote) and another that has obviously lost connection as it’s not reported in for 2+ days (off to fix that now).
Skimming the Zigbee specification library I couldn’t find anything on update interval, it could easily be non-specified and left up to the implementation.
I think the assumption zigbee devices are expected to send a keepalive message is false as devices using kinetic energy simply do not have the power reserve to do this.