Not sure if that's really supposed to be a wide table. You say you're calculating row means, but you're calculating column means instead. If your table is supposed to be transposed, then just transpose it. At any rate, there's no need for loops.
capmEstimates90 = table2array(capmEstimates90);
columnmin = min(capmEstimates90,,1);
columnmax = max(capmEstimates90,,1);
columnmeans = mean(capmEstimates90,1);
columnnans = sum(isnan(capmEstimates90),1);
columnmeans2 = mean(capmEstimates90,1,'omitnan');
outputstats = [columnmin; columnmax; columnmeans; columnnans; columnmeans2];
Yes, there are NaNs in there.
numberofnans = nnz(isnan(capmEstimates90))
If you're truly doing things by row instead of by column, contrary to the code you posted, then yes, each row has at least one NaN.
nansperrow = sum(isnan(capmEstimates90),2)
Though if you're doing things by column as described, most columns contain no NaNs, and no column contains more than six NaNs.
[counts edges] = histcounts(sum(isnan(capmEstimates90),1),'binmethod','integer');
nanspercol_instances = [edges(2:end)-0.5; counts].'