In AsyncResultsMerger::handleBatchResponse(), we detect the view kickback error code from the primary shard and fill out a ClusterQueryResult with the new resolved view. However, we only fill out the docBuffer of the remote. We don't touch the merge queue in any way, so it's left empty. If the query has a sort, we call AsyncResultsMerger::nextReadySorted(), which consults the top of the merge queue. Since it's empty, it returns an empty result.
There are a few ways we could fix this. Off the top of my head, we could also push remoteIndex to _mergeQueue when populating the result's view definition; or we could change the code to not go down the sorted codepath if a view's been discovered. I leave the strategy up to David Storch.