If you take a look at FBoolProperty::NetSerializeItem() - you’ll see that regular UPROPERTY() serializtion does actually serialize it to a single bit (and of course, the required header/offsets UPROP)
I’m not sure why serializing it via the << operator uses four bytes, it’s probably an oversight of FBitArchive or perhaps it’s to handle bitfields, but if you are using custom serialization you can easily serialize the property to a single bit yourself via:
Ar.SerializeBits(&MyBool, 1);