I've reproduced your result on R2018b. The result is according to the textscan documentation - I think.
- out1 is a cell array of character arrays with one item per cell
- out2 is a cell array of character arrays with one data row per cell
Case 1. One or more spaces are used as delimiter. That's by default and regardless of the value of 'MultipleDelimsAsOne'. Doc says: If you do not specify a delimiter, then: the delimiter characters are the same as the white-space characters.
Case 2. '@' is used as delimiter. '%s' matches the entire row, since no delimiter is found. (I don't find a sentence in the documentation to copy. There is something about row-oriented that goes without saying.)