See Assembly programming memory Allocating EAX vs Ax, AH, AL for how AX, AH, and AL overlap, as subsets of EAX.
Writing partial registers (AX, AH, or AL) doesn't modify the rest of EAX. (In 64-bit mode, writing EAX does zero the upper half of RAX)
So mov ax, [esi] leaves the top 2 bytes of EAX unmodified, and replaces the low 2 bytes with AX=0x1233. That means AH=0x12 and AL=0x33, and EAX=0x22 66 12 33.
Bytes in memory are little endian, so mov ah, [esi + 1] loads 0x12 (the upper byte of 0x1233, the first word of the array.)
This is assembly language. Everything is just bytes. It doesn't matter that they got there in that order because you used WORD 1233h,2245h instead of BYTE 33h,12h, 45h, 22h. The CPU doesn't know or care about any "meaning" for the instruction, it just loads 1 byte from [esi+1], and puts it in AH. (Which already had that value from mov ax, [esi]).
Bytes in registers don't have an endianness, since they don't have addresses. Left shifts always multiply by 2, right shifts always divide by 2 (rounding towards -Infinity, unlike signed integer division).
See also the x86 tag wiki for more FAQ questions, and links to docs and guides.
You can always put this code into a program and run it in a debugger to watch register values change as you single-step through it. If you're not sure what happens, do that.
BTW, mov esi, ptr2 is silly. mov esi, offset arrayW would do the same thing without needing to load a pointer from data memory.