The described effect is possible with macros, although I'm not sure if it's exactly what you're after. You can define a macro as a short-hand name of another variable (among other things). That would be called an "alias", not a "reference" (as in "pass by reference"), though. It won't be a reference to anything, it will merely replace all instances of the macro key (PLAYER_HP) with its value (global.player_character_health_points).
GML:
global.player_character_health_points = 5;
#macro PLAYER_HP global.player_character_health_points
PLAYER_HP = 10;
show_debug_message(global.player_character_health_points); // 10
Structs (and only structs) are always passed by reference. Data structures could be remotely described as similar to pass by reference - they are an edge case, as you are really passing around their ID and then accessing the actual structure by using the ID as a handle. Arrays behave similarly to pass by reference, but only when written to via their @ accessor (this will write to the original, referenced array), as they are otherwise copy-on-write (which will create a copy of the original array in its current state, unlink the copy and write to it).
Edit: Clarity.