Neither. It treats val as an integer pointer, offsets it by one, obtains a reference to the pointed-to memory location, and copy-assigns the right-hand side to that referent.
Let's look at the lvalue expression -- the stuff on the left: *((int*)(&val) +1)
We know from parentheses and the precedence rules which happens in what order. Starting from the inside,
(&val) Take the address of val. (int*)(&val) Treat it as an integer pointer. ((int*)(&val) +1) Advance to address the next integer. *((int*)(&val) +1) Obtain a reference to the next integer to val.
The referent then gets assigned the value of the right-hand side.