Is it possible to have automatic LOD (level of detail) on large scenes? Objective: build a virtual suburb in blender for use in creating exterior shots (not realtime: shots will be rendered in Cycles).

The angles of these shots will not be known in advance, so it's impossible to guess in advance which elements need to be high detail and which can be low detail.

Large scene becomes unwieldy and incredibly memory-intensive with hundreds or even thousands of high-detail objects, especially when many are not in shot. Scene will be utilized by an artist on home computer, so excessive memory use is not viable. Convenience is the primary objective to maximize efficiency in setting up and rendering shots. Renderer to be used is Cycles.

The higher detail of the nearby models would not necessarily be provided by subdivision. A perfect example of the sorts of things I'd be working with are buildings; up close, they would have fully modeled doors, windows, and other small details like flags, while far away, those fine details could be baked into textures, made more rudimentary, or simply omitted altogether.

Is it possible to automatically swap out lower detail meshes/materials at long distance for these renders?

I am also interested in alternate solutions. Since there are only 20 layers available, the only alternate solution I can come up with would be to divide the suburb into sections and have a high-detail and low-detail version of each section put onto adjacent layers, which the artist will toggle based on the position of the camera and what is visible in the shot, but this would be less than optimal. Any other ideas are welcome.
I have two pretty detailed posts that when added together, would seem to come up with a pretty good fit for your situation.

I won't detail out those steps, but I will link to them, and summarize the workflow in a summary of logic.

Creating Distance/Rotation/Scale Based Drivers - See this post

Swapping Groups of meshes with drivers - See this post

The main rundown here, would be to drive your level of detail threshold by camera distance values, then using the same logic of swapping groups of meshes, use this threshold value to determine which LOD group to select on any given instance with this driver attached.