It’s likely because the add child call is deferred as well, and so what is happening is the child is added after the update but not yet initialized (_ready not called yet) and then it sets the position. Then in the next main loop, it initializes the new node (because deferred happens at the end of the prior loop) and this sets it’s position to 0,0.
The way around this is to combine your deferred function calls into a single function and only call that function deferred. In the single function you can call add_child and then set the global position without deferring (since you know the function will be deferred) and that should, I think, fix it because add_child should initialize it right away.
Another option is to set a property/variable on the deferred node you just added and then in the code for the node, check if the property is defined and if it is, move the global position there and set the property to null.