I reckon Python would be a good bet. This is one example of why I want Blender to have arbitrary IPOs and that everything is animatable. Being able to animate everything means that you can assign expressions or at least arbitrary links to object parameters. Having unlinked IPOs means you can simply create an IPO with an identifier somewhere like a global variable (Shake does this) and you can reference it from an expression field.
This case is slightly different as you don’t really want to add an expression to every object manually. Here, I would just use a script-link. Then on a frame refresh, have a script that iterates through your object names or types and sets the scale to be an expression of a single IPO but indexed at a different time depending on either the name or perhaps object position.
The tricky part might be knowing when to scale further down objects because just scale, name or position values might be inaccurate and you’d end up with root chunks appearing from nowhere.
I’d actually use an extruded object for this - you link a curve to the profile and then animate the curve so that the extrusion profile animates. They did animated roots in Elephants Dream - not sure if they did it that way but it seems like the easiest way and I’ve used it before. Plus you always have control over the curve direction.