Надо смотреть, что там компилятор нагенерировал.
Создайте 2 функции, которые отличаются только вот в этих вот местах.
Вставьте код в
https://godbolt.org/
Смотрите ассемблерный код для двух функций.
Может, срабатывает
strict aliasing. Видя тип T сомпилятор понимает, что эта переменная не может быть изменена какими-то другими std::byte в соседнем коде и может, например, пропустить загрузку-выгрузку данных в регистр из памяти.
Может вообще что-то другое.
Единственный вариант разобраться - это смотреть на ассемблерный код функций, которые вы и сравниваете. Не каких-то кусков, оттуда надерганных, а функций целиком.