I see a number of issues with your code.
First off, the call to squeeze and he two calls to reshape have no effect on any variables you can use later in the code. In MATLAB, argmuents are passed to functions by value, so if you don't store the output of the squeeze and reshape functions, there's no use in calling them. If I understand the rest of the function, this isn't useful anyway.
Second, you appear to be trying to "double dereference" the variable D inside your for loop. MATLAB doesn't support this functionality.
Lastly, I don't think that kmeans is going to give you the results you are looking for in this case. If this 16th slice really is 2D image data, then you've eliminated a fair amount of data by finding the max over any given column. The code as written (with the issues I've described above resolved) would simply break the maximums into 4 ranges, and tell you which of the maximums belong to each range. So, you'd end up with the a 1-dimensional cross section of the image data, split into segments based on the maximum in each column. This doesn't seem useful unless I'm not understanding the application. And your call to imshow is going to show a single column of information.
Without trying to predict what you are hoping to do with the output of this function, here is what you've written, with the errors and extraneous code removed. What this code will do is "colorize" the slice using the colors k, r, g, and b.
Hope this helps!
s16 = D(:,:,16);
idx = kmeans(s16(:), 4);
imshow(reshape(idx, size(s16)), [0 0 0;eye(3)]);