There's a common yet subtle misconception among mathematics students that algebraic laws are prior to the numerical values that they describe. For example, "why" is it that:
$$5(3+2)=5\cdot 3 + 5\cdot 2\tag1$$
The tendency is to say, oh, this is true because of the distributive law: $a(b+c)=ab+ac$. But actually, equation (1) is true because it's true, not because of an abstract law. That is, you can actually calculate the left hand side and the right hand side and check that they're equal. And it's the fact that that always works that justifies the abstract law.
In your case, the binomial theorem is considered true because it always works when you plug in actual numerical values. You know how to calculate $(2+3)^8$ without the binomial theorem, but the result you get is consistent with the binomial theorem. To compute an expression using a general theorem, and then conclude that a specific numerical expression has a specific value is backwards reasoning.
If we're starting from the point of view that $0^0$ is undefined, then when we apply the binomial theorem to $(0+a)^n$ and realize that it's asking us to compute $0^0$, the conclusion is not that the binomial theorem is true all of the time, and that therefore $0^0$ must have a certain value, the conclusion is that therefore the binomial theorem does not apply to $(a+b)^n$ when $a$ or $b$ is zero. If we want it to, we have to come up with a definition for $0^0$, and then re-prove the binomial theorem, making sure that our proof is consistent with our new definition.
And, in fact, if we define $0^0=1$, then it's possible to do that. Your reasoning almost amounts to a proof that given that definition, the binomial theorem works, but it's important to recognize that you're verifying that a given definition leads to a given theorem, you are not concluding that a definition is "true" as a consequence of a theorem.