Reviving this topic because the Extension system in Blender 4.2 provides a proper solution to this problem, which involves packaging .whl files (which you can download from PyPI) with your extension, and then mentioning that .whl file in the extensions' manifest file. Documentation here.
It's also possible to pull this off pre-Blender 4.2, by implementing your own code to import .whl files, which is easiest to do by simply stealing this code from Blender Studio
I've just tested both methods and they work great, unlike any other solution I've tried, which either relies on deprecated pip function calls, or they install the modules in the global python environment no matter what you do, which isn't available from inside Blender, or they rely on launching Blender from a venv, which is obviously silly.