I notice the same thing, there might be a bug in Safari.
The selected response provides a very clunky way of updating the permission state, which is valid but not optimal.
Optimally the change event fires and the assigned listeners trigger (if it would work as expected). But if a separate optimal way of figuring out permissions is wanted (like Nightwalker's answer attempted to propose) you would just await the getUserMedia promise, and if it resolves with no errors, then permission is granted.
No need for intervals or any weird hacky solutions.
If the user denies, the getUserMedia request will throw with a DOMException name of NotAllowedError (some browsers may handle it with a different error, but you can infer it by testing in a catch/log).