Hmm, I wrote all this intermittently over the course of the past hour while doing other things, then hit preview and saw your post about your hard drive being dead. Might as well post what I wrote, though.
No, currently you only have access to the first branches, the children (and extradata) of the root node, none of the nodes from there.
OK, that makes sense.
I'm still thinking about how to handle that one.
I'd be wary of going too far forward without it -- you don't want to paint yourself into a corner and have to deprecate a bunch of functions because you've created hierarchy-capable replacements for them, but keep having to support them forever because mods are already relying on them.
One possible approach that comes to mind is to change the Child ID to be a more general Node ID that can represent nodes anywhere in the tree. You can define the root node to be ID #0, and traverse the tree (preorder, postorder, breadth-first, whatever) to assign numbers to all the others. All the existing commands that take a ChildID and NifID would still work in basically the same way, but could operate on any node rather than just top-level children.
What would need to change, to implement that approach, is just the way that scripts learn what ID numbers are valid. Currently you have NifGetNumChildren, which provides one end of a range of numbers whose other end is implicitly zero. That could be changed to something like NifGetChildren, which would take a NifID and a NodeID and return an array listing the IDs of the node's children. Scripts would call it once with a NodeID of zero, then again with the IDs obtained from the first call, and so on.
If you'd rather avoid returning arrays, you could use a breadth-first traversal to produce the node ID numbers, so that sibling nodes are always numbered consecutively. Then you'd just need a pair of commands that return the starting and ending IDs of a node's children.