Nevermind - I think I got it. In order to reparent and retain all children, the reparent() method must be called in a second pass. You can’t reparent while iterating through all nodes in the scene (which makes sense).
The other thing is that you have to recursively go through all the children and set the scene root:
func secondPass():
for node in reparent_nodes:
#[node, reparent_to]
node[0].reparent(node[1])
node[0].set_owner(get_tree().edited_scene_root)
set_children_scene_root(node[0])
func set_children_scene_root(node):
for child in node.get_children():
set_children_scene_root(child)
child.set_owner(get_tree().edited_scene_root)