I am confused where all of the values of x are stored before termination.
They are stored on the call stack.
In the beginning, the call stack only has main. Then main calls multipleThree. This pushes a new frame onto the call stack. The frame will store things about where this call to multipleThree has progressed to, what local variables there are, etc.
Let's say you entered 3. x, which is stored on the frame that is currently the top of the stack. The else branch gets executed, and multipleThree gets called again, so a new frame gets pushed onto the call stack. Note that we are not done with the first call to multipleThree yet. We can come back to it when we finished executing this second call to multipleThree. Remember that the 3 you entered is still stored on the call stack.
Let's say you entered 5 next, the same thing happens - the number 5 gets stored on the top of the stack, then a new frame gets pushed as you call multipleThree again (this is now the third time).
Finally, you enter -1. At this point, the stack looks like this:
multipleThree (x = -1)
multipleThree (x = 5)
multipleThree (x = 3)
main
You can see this in the debugger on your IDE. e.g. in IntelliJ IDEA

Because you entered -1, this call to multipleThree actually finishes because it reaches the return statement. The top of the stack now gets popped, and we go back to executing the second call to multipleThree. The stack now looks like this:
multipleThree (x = 5)
multipleThree (x = 3)
main
In the second call, remember that x is 5 - not divisible by 3, so we don't do anything. Now we are done with the second call to multipleThree, so the stack gets popped again:
multipleThree (x = 3)
main
Now we finally go back to executing the first call to multipleThree, when x is 3. 3 is divisible by 3, so we print it. Now we are done with the first call of multipleThree so we pop it off the stack too.
int xdeclares a variable inside the method, this is saved in that memory (frame). Not only relevant for recursive calls, but key for working of recursive methods. [since output is done after the call tomultipleThree, it will only be executed after the call(s) return]