Block can help with what you want:
f[x_] := x + 1; g[x_] := x - 1; In[13]:= Block[{f}, Hold@Evaluate [(f[g[a]]^2)] ] Out[13]= Hold[f[-1 + a]^2]
Do you want to prevent the evaluation of certain patterns while decreasing the cost of f ? (For example, block f[x_] , but allow f[x_, y_] )?
UPDATE
There is a functional form:
SetAttributes[EvaluateHeld, HoldAll]; EvaluateHeld[expr_, symbols : {__Symbol}] := Block[symbols, Hold@Evaluate [expr] ] In[7]:= EvaluateHeld[f[g[a]]^2, {f}] Out[7]= Hold[f[-1 + a]^2]
source share