> it seems so odd that functionality like Identifying/Querying Map Layers is only available on the MapView
This is fair criticism, but something to keep in mind is that Identify is a very UI-centric thing. It (typically) deals with the user actually clicking on the view, it's inputs are actual screen coordinates (not map unit coordinates), and the hit test is done based on the rendering of the features (so a large point symbol will still get found even if you don't click exactly at the center of the point).
You could instead do a spatial query of features based on map geometry directly against the layers without the view, but that's not really "identify" in the usual respect.
There really is only two operations directly on the view: The various Identify and SetViewpoint* operations, which all are very specific to working with the view. Pretty much everything else is tucked into objects you can put in your view model, like the Map, GraphicsOverlay, the location datasource, editor etc.
A good equivalent is the ScrollViewer/ListViews: They have view-specific operations for scrolling to a certain item/offset, and very much akin to the SetViewpoint method, and clicking an item is very much identical to the identify operation. None of these you can't really do without some view specific stuff.
Also one thing to consider: IMHO the purist MVVM approach where absolutely no code-behind can ever exist isn't really true to what MVVM is saying. You can have code-behind, as long as that code-behind is view-specific. For example a click handler that performs the identify, and then forwards the result to the view model is still completely ok and within MVVM. Sure you can do all sorts of tricks and jumps to mask that code into various attached properties etc, but you're just adding an enormous amount of complexity only to pretend you moved your view code out of your code behind, when really all you did is move your view code into some other view code, and in the process made your code much harder to follow and understand. It might make sense to do these tricks if you have any different views and want to reuse that same logic over and over again, but always I'd say to weigh the added complexity with the cost.