I suppose one might take the question to mean, Why was it decided to have Plot[] hold its arguments and not evaluate the function(s) until the variable has been given a value? It is a choice. If Plot[] (and Table[], etc.) let their arguments be evaluated, then we would have to learn to program our plotting as follows, unless we could be sure x had not already been given a value:
Block[{x},
Plot[D[Sin[x], x], {x, 0, 10}]
]
Programmers could Block[] the variables themselves instead of having Plot[], Table[], etc. do it automatically. We would get used to it, and maybe someone would be asking, Why do I have to use Block[]?
Instead another choice was made, and occasionally we have to use Evaluate[]. As Gianluca said, Mathematica programmers have to get used to this. The number of times I have to use Evaluate[] is fairly small compared to how often I would have to use Block[], so the choice seems convenient to me. OTOH, I was used to having to localize variables in C, so having to use Block[] all the time would probably have seemed normal.