Your sorting is nearly a multi-column sort (for which you'd use sortrows) except for your first criteria (smallest distance of two highest scores). As a result you have to use a loop (I think, couldn't find a way without)
scores = {'A' 'W' 10
'B' 'MW' 80
'C' 'NW' 62
'D' 'NW' 98};
distances = {'NE' 200
'SE' 300
'MW' 500
'NW' 600
'W' 700};
%first find distance corresponding to each region
[~, loc] = ismember(scores(:, 2), distances(:, 1));
scoredist = [distances{loc, 2}];
%second, find score order:
[~, scoreorder] = sort([scores{:, 3}], 'descend');
%create destination cell array:
sortedscores = cell(size(scores));
%loop until only one score left to process
for destrow = 1:size(scores, 1)-1
%find shortest distance between the two highest score remaining
[~, shortidx] = min(scoredist(scoreorder([1 2]))); %shortidx is either 1 or 2
%copy the corresponding row in destination cell array
sortedscores(destrow, :) = scores(scoreorder(shortidx), :);
%remove processed score
scoreorder(shortidx) = [];
end
%add final left-over score
sortedscores(end, :) = scores(scoreorder, :)