To me, the main problem is that the definition of f[] depends on the global symbol x:
f[x0_, n_] := Normal[Series[Exp[x], {x, 0, n}]] /. x -> x0;
This means a user or a function calling f[], like Plot[] or Table[], can affect its behavior. This is clearly not intended in this case. (If it were, the standard recommendation would be to make x an argument of f[].)
I suppose the standard fix is to use Module[]:
ClearAll[f]; (* <-- Good practice: remove previous defs *)
f[x0_, n_] := Module[{x},
Normal[Series[Exp[x], {x, 0, n}]] /. x -> x0];
Then Plot[f[x, 1], {x, 0, 1}] works without problem.
If you don't like local variables, here is a less standard, but perfectly okay, approach:
ClearAll[f];
f[x0_, n_Integer] := Evaluate[Normal@Series[Exp[#], {#, 0, n}]] &[x0];
Note the pattern restriction n_Integer. This ensures that Series[] won't be evaluated unless n is a definite integer. See remark below, too, for a related issue.
Remark:
The issue skates close to the typical ?NumericQ issue discussed in What are the most common pitfalls awaiting new users?. But I think localizing the dummy variable x is the best approach.
Evaluate[f[x,1]]in thePlotfunction. $\endgroup$