You kind of inadvertantly answered your question in your title.
The simplest way is to actually use a table instead of a cell array. tables are a lot easier to work with as well.
%convert cell array into table:
datatable = cell2table(data(2:end, :), 'VariableNames', matlab.lang.makeValidName(data(1, :)));
%sort rows according to odometer column:
sortedtable = sortrows(datatable, 'Odometer')
That's all that is needed. No searching for the odometer column. The table knows where it is.
If you don't want to use a table and want to keep using a cell array, then sort your rows ignoring the first one:
sorteddata = [data(1, :); sortrows(data(2:end, :), k)];
Note: the loop for finding the odometer column wasn't needed, this would have achieved the same:
k = find(strcmp(data(1, :), 'Odometer'));

