Hmmm not sure about keeping the actual range, but you could probably write a listener so that on blur you create a decorator to add a class around the range that is selected. The class can then mock the default highlight behavior with a background-color.
Yes, what @wes-r said, but note that a decorated range won’t look exactly like a real selection (won’t extend to the left margin, for example, and often leaves gaps).
Having your own onBlur prop set the selection to a plain cursor is also really easy.
That’d create invalid selections when the selection used to be a non-inline node selection (cursor selections can only occur inside textblocks). You might also want to leave node selections alone entirely. Something like:
onBlur: function(view) {
let {$head, empty} = view.state.selection
if ($head && !empty) view.props.onAction(new TextSelection($head).action())
},