Logic functions should be cascade-able so that one's output can feed another's input in a logical string. The OP's proposed NOT construction fails to be cascade-able because reference point for input differ from the reference point for output.
However, such a construction is possible at the beginning or end of a cascade, where no other logic need be driven. At the end of a logic cascade, we have freedom to choose the reference point. For cascaded logic strings, the reference point is always the same (most often GND).
An example:
Suppose we wish to drive an indicator like a LED. We have a choice to reference the LED to logic low or to logic high...that is, to GND or to Vdd. The choice of reference point allows us to invert the LED's indicator function:
simulate this circuit – Schematic created using CircuitLab
This LED example works because light is only produced when current flows - with zero voltage or reverse voltage you get no light. I would suggest that the freedom to choose its function is a result of the freedom of choosing its reference point. The LED diode itself cannot do the "invert" function if you do not have the freedom of choosing its reference point.