The object it's inside will still take up at least one byte.

    sizeof(struct {bool a:1;}) == sizeof(char);

Amortization.

If one Boolean must be a byte then 8 must be eight bytes. Which is not true. A boolean can be 1/8th of a byte which is a meaningful distinction.

3^5 is 243 so one could also call an optional Boolean 1/5th of a byte, though 1/4 is so much simpler to read and write.