Why does font selection only rely on the Desktop's default LookAndFeel?

First of all, you can create a font from a custom typeface. If your LnF returns those font objects, You’ll be able to do use custom fonts for JUCE Components that use the LnF.

Edit: see [Guide] Juce Font Embedding (2019)

Secondly the problem ist, that the Font objects somehow need to obtain the pointer to the LnF instance to then create the typeface. But because the Font objects don’t have a reference to the current LnF they are using the global one. Otherwise Font instances would always be coupled to a component or a LnF.