Targets listed in Slicer_TARGETS CMake variable are exported to the targets file here. Each library is added to Slicer_TARGETS, for example Qt libraries are added here. Try to find out why module library target is not exported: is it not included in Slicer_TARGETS, or there are no exported symbols, …?
I think it could make sense to make Qt module class (derived from qSlicerLoadableModule) available for other modules. Some features that require Qt and not related to the module widget are implemented in the module class and may be needed to be accessed from other modules.
SlicerVirtualReality is not the only extension that uses module class for module-specific functions that may be useful for other modules. For example, Sequence Browser module uses the module class, too (for managing sequence browser toolbar). Any other logic that requires Qt but it should be available regardless of a module widget must live in the module class.
I agree that it is better if we don’t need to expose the module class, but only if we don’t need uglier workarounds to achieve what we need.