For USB, you always need libraries unless you want to implement major parts of the USB protocol. The safest bet is probably STM32 HAL as it supports your MCUs including USB HS. STM32CubeMX can generate the basic code for you.
I agree that a virtual COM port is not the best option. The Windows drivers seem to contain a lot of code to control the bandwidth in order to prevent data loss on the serial lines. As a result, they are not that useful for speed beyond a few mega bits.
Since you will use USB HS, you probably want to transfer a sizeable amount of data. So you have to implement USB bulk endpoints, likely one for each direction. This isn’t too difficult. There are several tutorials, e.g.:
https://medium.com/@manuel.bl/usb-for-microcontrollers-part-1-basic-usb-concepts-519a33372cc9
The tutorial focuses on libopencm3 code but the linked GitHub repository contains STM32 HAL code as well. (libopencm3 does not support USB HS.)
For working with Windows, you should implement the WCID extension (also shown in the tutorial). It ensures that Windows automatically loads the WinUSB drivers.
From Windows, you can access the USB device with a variety of APIs and programming languages. The tutorial shows how it do it using Python.