Вероятно, компилятор производит преобразования типа при присвоении bool = не_bool. А при присвоении bool=другой_bool он считает, что всё уже преобразовано до того, и не проверяет. Вы же, своим хитрым хаком
Код
unsigned char* Ptr;
Ptr = (unsigned char*)(&B);
*Ptr = 13; //B = 13
избежали проверки при присвоении значения переменной типа bool, и перехитрили компилятор.
Если бы я знал, что такое электричество...