You can always copy the observer into the observed structure (and avoid a lot of complications - observers are best created with FP, not OOP). You can also carry the GUI and whatever else you want as a parameter when executing the observer.
But, of course you won't be able to mutate arbitrary global state.
But, of course you won't be able to mutate arbitrary global state.