HIGH and LOW are BOOLEAN values and not specified in the reference as integral values, so it very much depends on what type of variable ledState is defined.
digitalWrite takes LOW or HIGH. You happen to know that they are actually zero and one respectively, so tricks treating them as boolean will work as expected.
In this case it's harmless, but it's generally a really bad idea to rely on what you know about how something is implemented because you have no guarantee that it will never change.
I prefer that the sketch shows what it is doing.
The 'not' or the '!' is a logical operation and a 'bool' type is a logical variable. That makes sense.
The function digitalWrite() uses HIGH and LOW. Some say they are 1 and 0 and the same as true and false, but that is not correct for all Arduino board and that is not mentioned in the documentation.
I'm with @wildbill. Don't try to be too smart. Don't make shortcuts. Don't assume things that are not mentioned in the documentation. Don't show off with trickery compressed slimy code.
Yes. Because there is no assurances as to what HIGH and LOW really are and the code should not make any assumptions about what type they are or their values.
While most implementations define HIGH as 1 and LOW as 0, it is not required.
So to ensure that the code is portable and will always work/compile across all Arduino core implementations including past and future versions, this code makes no assumptions about the values or type for HIGH and LOW, which is the safest and most reliable thing to do.
To assume a specific implementation is abusing the API since there is no assurances as to what / how HIGH and LOW are defined / declared.
They are never defined in the Arduino documentation.
I believe at one point Arduino.cc was going to change HIGH and LOW from simple defines to specific type or enum. In that case, using something like
ledState = !ledState;
would break since it would not compile.
Note:
Treating HIGH and LOW as 1/0 or true/false as been discussed many times on the forum. While it typically works, it is abusing the API and is not guaranteed to work and should be avoided.