No it's not. The very documentation you linked to says that if you use SCARD_AUTOALLOCATE as the length, then it should be a pointer to a pointer. It's basically an *mut *mut i8. Just think about it – if you only had a single level of indirection, it would be impossible for the API to fill in your buffer without you pre-allocating space for all the characters, as it couldn't modify the pointer itself.
Thus, the solution has nothing to do with transmute(), and everything to do with the fact that in the second case, you are passing the address of your null pointer itself, which means that it will be changed to a non-null, valid pointer, that points to a buffer (that is allocated by the function).
So, just do this:
let mszReaders: LPSTR = null_mut();
let ptr = &mut mszReaders as *mut _ as LPSTR;
SCardStatusA(hCard, ptr_trans, SCARD_AUTOALLOCATE, ...);
No transmute needed, as pointers can be cast directly. Incidentally, you should never transmute pointers.