While attempting to answer my own question, Is there a way to "hold" prefix / infix / postfix notation?, I came across the need to evaluate a recursive function only one level deep.
For example, consider a factorial function:
factorial[n_Integer /; n >= 0] := If[n >= 2, n*factorial[n - 1], 1]
Normally, expressions using factorial would be fully evaluated:
2 + 3*(factorial[5] + factorial[7])
(* 15482 *)
However, is there a way to evaluate factorial just once, and prevent evaluating any further occurrences? That is, a function, EvaluateHeadOnce:
EvaluateHeadOnce[factorial, 2 + 3*(factorial[5] + factorial[7])]
(* 2 + 3 (5 factorial[4] + factorial[7]) *)
I found a method (self-answered below) but it felt rather... inelegant. I'm curious to see how others would implement such a method, as well as hear criticisms / flaws in my approach.

TraceScanidea. However, unless I'm mistaken, a "step" in the context of that question is different from that of mine. In mine, I'm looking to evaluate as many steps as needed, until the second instance of a specified head is encountered. – Andrew Cheong Mar 01 '14 at 15:06