I'm not quite sure what exactly you're going for, but maybe this can give you some ideas (with and without HoldForm):
expr = HoldForm[Exp[Subscript[p, 2] + Subscript[q, 2] + z] + Exp[Subscript[p, 3] + Subscript[q, 3] + z]];
Replace[expr, {g_[___] :> g["\[Ellipsis]"]}, {-2}]
You're right that Mathematica should have a built-in function for iterative application. In this case it's Nest:
ApplyN[0, f, 5] == Nest[f, 0, 5]
There's also NestList, FixedPoint/FixedPointList, Fold/FoldList, NestWhile/NestWhileList, and the often-forgotten ComposeList. They're all quite useful. Off the top of my head I only remember one case of Mathematica not having a structural operator that I thought it should have. It's just a matter of searching the docs and recognizing that the names can be a bit goofy (eg I'm looking for "Intersperse" and find "Riffle").