То, что вы видите, вовсе не является проблемой сокрытия. Вы не создали оператор присваивания, чтобы назначить B в B, поэтому компилятор создал его для вас. Тот, который создан компилятором, вызывает оператор присваивания A.
Поэтому, если ваш вопрос «Вопрос: почему B :: foo скрывает A :: foo, а B :: operator = нет?» следует прочитать «Чем оператор = отличается от обычной функции», разница в том, что компилятор предоставит вам ее, если вы не напишите свою собственную.