Sounds like you got it figured out, but in case its useful, this is the relevant section, and @everywhere println(a) is indeed the correct way to access the value of the global variable a on the worker without triggering an auto-send from a on the local process (conversely, @fetchfrom 3 a[2] triggered the auto-send, hence why it ended up being 5 on that worker).
The other thing you can do is “hide” accessing the global from the auto-shipping mechanism (and hence prevent auto-sending it) inside an @eval, e.g.
@fetchfrom 3 @eval a[2]
will not send a, it’ll return the global a[2] exactly as it currently exists on the worker.