I think I have an idea which is exactly what you want.
I have implemented an algorithm called “Instanced LOD”, which combines the LOD and instancing.
Take a forest scene as an example:
First, for every frame, calculate the distance between every single tree and the camera, then set levels of details. For example, set distance[0,100] as level0, distance[100,200] as level1, and so on.
Second, take all trees in level0 as a THREE.InstancedMesh, all trees in level1 as another THREE.InstancedMesh. Render these InstancedMeshes to the screen.
Finally, update the camera position, re-calculate the distances between trees and the camera, re-allocate the instancemeshes in every frame.
Here is a demo showing the above example: https://strange-forest.netlify.app
And the source code is here: https://github.com/Strange-tech/100kTrees