First of all, the Not operator works properly, exactly as it should.
"Duh. But I'm trying to toggle the .FitText property in a table cell (in Word). .FitText starts as True..."
To toggle, this works just fine:
If Selection.Cells(1).FitText Then
Selection.Cells(1).FitText = False
Else
Selection.Cells(1).FitText = True
End If
As for why you do not see the result you expected, this has to do with type casting, implicit type conversions and passing value of a type to a variable of the same type. In your case, the cell's property is Boolean. Since you explicitly set the receiving variable type to Boolean, no implicit type conversion is taking place: Boolean X gets the internal value of the Boolean property, which (Cindy Meister is correct) just happened to be 1, and 1 does evaluate to True as a Boolean variable.
Now, Mathieu Guindon correctly commented that "The -2 is because logical operators do bitwise operations...". So, Not 1 = -2, and -2 also evaluates to True; in fact, any number stored internally for a Boolean variable but 0 makes the value of this variable True, as in an explicit CBool(any_number_but_0) = True.
So the problem here is Boolean-to-Boolean passing of the numeric value 1 (the internal representation) from one to another. You need to force variable type re-evaluation, implicitly or explicitly, and all will work as you wanted:
' Illustration: a few possible solutions
Dim X As Variant
' implicit re-evauation
X = Selection.Cells(1).FitText ' X=True, a Variant sub-type Boolean, CInt(X)=-1
X = Not X ' X=False, CInt(X)=0
Dim X As Boolean
' explicit re-evaluation
X = Selection.Cells(1).FitTex ' X=True, CInt(X)=1
X = Not CBool(CInt(X)) ' X=False, CInt(X)=0
' explicit re-evaluation
X = Selection.Cells(1).FitText ' X=True, CInt(X)=1
X = Not CBool(CStr(X)) ' X=False, CInt(X)=0
' explicit and implicit (by the "+" operator) re-evaluation
X = Selection.Cells(1).FitText ' X=True, CInt(X)=1
X = Not (CBool(X) + 0) ' X=False, CInt(X)=0; same as Not (True + 0)
etc.