You can use the MaxBy method in MoreLinq to efficiently execute this query.
var result = dictionary.MaxBy(pair => pair.Value).Key;
This will only be necessary to reprocess the data once, and not to sort the values โโand get the first result (which will be O(n * log(n)) ).
Since only keys, not values, are sorted, there is no way to execute this query without missing at least one cycle after each key pair.
Another option is to have two SortedDictionaries. You already have one of them, and the other is a reverse dictionary. For each value in the current dictionary, you can add it as a key to the second dictionary, and the value of the second dictionary will be the key in the first (if it is a ratio from one to many, and not one to one, the value of the reverse search should be a list of elements). Although it will be programmatically โexpensiveโ (more memory than in time, but still some of them) to create this second dictionary, as soon as you do this, you can efficiently query based on values, not keys.
Servy source share