The following was produced by my decompiler of some disassembly

DWORD v4 = *(_DWORD *)(*((_DWORD *)&dword_8EF798 + a2) + 1020);

i dont understand how the & changes the above pointer dereferencing.

Can you explain the different in interpretation of

*(_DWORD *)(*((_DWORD *)&dword_8EF798 + a2) + 1020);
*(_DWORD *)(*((_DWORD *)dword_8EF798 + a2) + 1020);


Presumably dword_8EF798 isn't a pointer, but an actual dword object. To dereference it you first need to take the address. Without the address-of operator, you'd be dereferencing whatever integer value is stored in the object, and probably get an access violation because it's not a valid address reference.