Rendering thousands of objects results in low FPS but also low GPU usage

Just for clarification: The performance of your application is bad since the number of draw calls is too high. There are several existing topics in this forum about draw call reduction e.g.:

Using instanced rendering e.g. via THREE.InstancedMesh is one possible approach to improve performance.