That’s a good question! Often, the best we can do is to read the documentation for the API and attempt to determine whether or not this host/client have implemented the API correctly. Unfortunately, the documentation is quite sparse in this case, so the answer is not clear.
The API documentation for the AUCocoaUIBase protocol (which includes the uiViewForAudioUnit method) doesn’t mention any requirements about when this method is allowed to be called, or cases in which the returned view is allowed to be null. I think I would expect the plugin to be able to return a valid view directly after construction for this reason, and I also think it’s a reasonable fallback for JUCE to automatically create a generic view if creating a non-generic view fails.
An audio unit’s view should work whether the audio unit is simply instantiated or whether it has been initialized. The view should continue to work if the host uninitializes the audio unit.
So, I’m inclined to say that this is a bug in this specific plugin. If you’re aware of more concrete documentation indicating that JUCE’s hosting behaviour is at fault, please let me know and I’ll take a look. Otherwise, I’d recommend filing a bug report against the plugin.
Finally, in testing, it looked like this particular plugin is able to create its non-generic view a little while after construction (Timer::callAfterDelay (100, [plugin] { plugin->showWindowExplicitly(); }); worked fine). Maybe that’s a suitable workaround for your use-case.