This is OK:
(%i42) subst(not p,p,p);
(%o42) not p
This is not be an error:
(%i43) subst(p=not p, p);
incorrect syntax: Found logical expression where algebraic expression expected
subst(p=not p,
^
But subst accepts this:
(%i43) subst(p="not"(p), p);
(%o43) not p
Actually, this is not related to subst:
(%i1) p = not q;
incorrect syntax: Found logical expression where algebraic expression expected