Your issue seems to be one of value vs. reference types.
The reason it works as an Object is that Objects are reference types: when you pass an Object to a component, you are passing its reference, not a "copy". That means that when you mutate that Object (in a child, for example), any component with a reference to that Object will "see" the change.
The same isn't true for value types. When you pass a string, number, or boolean to a component, you are passing the value, completely unlinked from the source variable.
You shouldn't be mutating something inside a child component which is relied upon by its siblings and/or parents. You should either be using a service (with methods for mutation) or an @Output to bubble the change event upwards from the child.