A[1:9] is separated out as a new (temporary) array, with its own separate memory, so shuffle! only gets to modify that. A itself remains unchanged.
Doing view(A, 1:9) or @view(A[1:9]) (both do the same thing) gives you access to that part of the array without allocating in a different new memory spot. This lets shuffle! modify the contents of A itself.
view is a very useful feature to know for performance too, because allocating new memory can be costly, and views avoid that. So when you need high performance in some part of the code and are accessing slices of arrays like A[1:9] in it, changing those into @views can give a good performance boost (unless you actually need a copy of the values, of course).