The reason it is not removing automatically is, that the Listener is just an interface. To automatically remove a listener, it would need a pointer/reference to the thing it listens to.
Then a listener can (and often does) listen to several objects, so it’s not only a pointer/reference, but a list (or rather vector) of pointers.
An alternative approach would be, if the ListenerList would consist of WeakReferences instead of pointers. That way on each call it could check if the listener still exists. But that is overhead, that might be performance critical, nobody knows.
The JUCE way is not to add autmatic behaviour for cases, that might not apply. This follows the overall C++ paradigm only to do things unasked, that don’t add a runtime cost.