&mut self means that it takes exclusive control of the wholeself object. Rust doesn't check function bodies, so it doesn't matter that you only use child inside. If the function signature says all of self, then it requires all of self.
And when this method is called there can't be anything anywhere else holding any other reference to self. However, there's events_loop variable that is borrowed from self, so it locked it for its own exclusive use.
If you think of &mut as an exclusive write lock, then you have a deadlock from locks on events_loop and render.
I think I understand the problem, but this is such a common idiom coming from garbage collected languages that I'm having trouble crafting a solution. Any help or advice with an alternative approach would be appreciated.
Don't use methods. Instead of &mut self make an associated function that takes child only.
Separate objects out. Don't put events_loop in the Window, but pass it separately.
Use interior mutability. Instead of &mut, use shared & references and RefCell that allows to "cheat" and get &mut out of an "immutable" reference.
Rc<RefCell<T>> or Arc<Mutex<T>> are commonly used to get all the freedoms of a GC language. They add some syntax noise, because Rust likes to be explicit about such things.