The stack is just memory, nothing else. The only difference is that this memory CAN be acceded with stack-related instructions (pha, pla, php, plp, jsr, rts) while it can also be acceded like normal memory (like in lda $105,X).
It's highly probable this instruction is precessed by a tsx instruction, which sets X to be equal to the stack pointer. Then $101,X will access the last pushed byte, $102,X the 2nd last pushed byte, etc.... Therefore, if precedded with tsx, this opcode will read the 5th byte in the stack.
If this is inside a subroutine, it could be reading the return address the caller pushed on the stack with the jsr instruction. Some games use this technique to pass many arguments to subroutines while using less bytes than by passing them through zero-page variables, as explained in
this post.
I hope this was helpful.