Does Head evaluate its argument?
concerning assign:
1. arg: no
2. arg: yes
If you need to evaluate an expression "manually" [before taking the fist item from the result], use Eval():
x=f()[1] // doesn't work
x=Eval(f())[1] // works
concerning glue:
any args: yes
.... and Eval:
yes, of course!
besides that, there is an additional evaluation of the return value *) - after a first evaluation of the argument. So
Eval(print(1);x= Expr(hello);print(x); Expr(print(2)));
correctly assigns x=Expr(hello) and prints:

*) -> link / documentation / community?