EDIT, much better way to do this using properties
answer below is for versions prior 2.8 with the use self option available. Also not a recommended way to use driver system.
Fudge the driver system
Firstly we'll set up a custom driver that sets a property of all children recursively to the value of the parent.
for child in t.children:
yield from traverse_tree(child)
def set_children(obj, prop):
val = getattr(obj, prop, None)
if val is not None:
for c in traverse_tree(obj):
setattr(c, prop, val)
bpy.app.driver_namespace["setchildprops"] = set_children
Now we can add a driver to a custom property on the same object as the property we wish to set on all children.
making sure to check the non default "use_self" property of the driver.
Now if you keyframe the "hide" property of the same object it will hide / show children accordingly. Note it will not update the UI automatically, until some property eg frame is updated.