I don't see how version is used to filter child nodes in the above method.
It works because of the line:
in addAllChildrenToDeleteTransaction - only children with the same version will be deleted. Generally, we are just going to want to delete all versions (version == -1), so don't often expect funky cases, but this way also ensures that you just delete children with the same version as the parent (and fail if those versions don't match up). I didn't want to go with any assumptions on versions of children vs. parent since there was not need for it yet AFAIK.
Will there be any request size problem if the subtree to delete is large?
Not unless you are going to blow out the stack or memory. However, that seems incredibly unlikely. Seems a little excessive at this point to do the tail recursion optimization, but can switch to that if it seems a big issue.