When is it actually beneficial to use LOD in Three.js for performance?

The most appropriate built-in abstraction for what you’re describing is probably THREE.BatchedMesh, since that allows you to show/hide and translate/rotate/scale instances of many different geometries. If you need different materials for some cases (highlighting? outlines?) just hide the affected objects from the batch temporarily and render them separately.

That said, there’s nothing magic about THREE.BatchedMesh. You could instead build your own batching solution using a large THREE.Mesh to represent many objects in a batch, and manage the vertex attributes or uniforms as needed to handle interactivity for objects (subsets of vertices) within the batch. That level of control might be ideal for many applications.