Hi!
You could add a button that when pressed, assigns the plot expression to a variable:
Manipulate[
Column[{Button["Calculate",
plot = Plot[
ReleaseHold[ReplaceAll[f, {o -> oval, p -> pval}]], {x, -5, 5}]],
Dynamic[plot]}], {{oval, 1, "o"}, 1, 10}, {{pval, 2, "p"}, 2,
10}, {{f, Hold[Sin[o x + p]]},
InputField[Dynamic[f], Hold[Expression]] &}, {{plot,
Plot[Sin[1 x + 2], {x, -5, 5}]}, None }
]

plot is a dynamic variable inside manipulate, but since I specified "None", it does not have a control associated with it.
I realized what causes the problem in your original code:
Manipulate[DynamicModule[{f = Sin[o x + p]},
Column[{InputField[Dynamic[f]], Dynamic[Plot[f, {x, -5, 5}]]}]], {o,1, 10}, { p, 2, 10}]
Since o and p are tracked by manipulate, any changes to them will reevaluate expressions inside of it. This includes the assignment f=Sin[o x +p] in DynamicModule. In fact, I think the whole dynamic module will be re-instanced.