That is indeed strange.
Note that A(k) makes a lot more sense than {A{k}}. Both create the same thing but conceptually, A(k) just says give the cell at index k whereas {A{k}} says give me the content of the cell at index k and put it into a cell again.
Behind the scenes, both syntaxes have to allocate memory for a 1x1 cell array and then copy the pointer to the matrix contained in the cell, so I don't understand why the massive difference in speed. Only Mathworks can tell us what is actually happening.
At the end of the day, unless the profiler has highlighted that line as a bottleneck, I would go with the A(k) syntax which in my opinion is more appropriate and easier to read.
Note that if you're chasing for performance improvements, your example has two problems that have a lot more impact on speed and memory
- the allocation of a 100x100 cell array, of which you only use the first column
would be a lot better
- the copying in a loop of the matrices
a2 = reshape(num2cell(a, [1 2]), [], 1);
would eliminate the loop and the need for the preallocation.