cellfun(@(C) isnumeric(C) && any(isnan(C(:))), a)
for the case where you want to check whether the entry contains NaN anywhere. If you want to check to see whether the entry is a single NaN then
cellfun(@(C) isequaln(C, NaN), a)
You are getting the vector of results because strings are arrays of char and isnan() was testing each element of the array
In the situation where you know that each entry is either a string or else a NaN, then test
~cellfun(@ischar, a)