EDIT, much better way to do this using properties
https://blender.stackexchange.com/a/147144/15543
https://blender.stackexchange.com/a/197072/15543
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.
import bpy
def traverse_tree(t):
yield t
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)
return 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.
setchildprops(self, "hide")
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.