Почему из двух функций, стоящих в условии цикла, при определенных условиях выполняется только одна?
Фокус в оптимизации логических операций.
Если первый операнд AND имеет значение false, то результат будет false независимо от значения второго операнда. Соответственно, вычислять второй операнд смысла нет.
Аналогично, если первый операнд OR имеет значение true, то результат будет true независимо от значения второго операнда.
Если вам нужно, чтобы выполнялись обе функции, то решением, как ни странно, будет явный вызов обоих функций в теле цикла с записью результатов выполнения в переменные.
Но столкнулся с такой проблемой: если первая функция возвращает true, то вторая функция даже не выполняется. Если поменять or на and, то ситуация повторяется, но наоборот: если первая возвращает false, то вторая не выполняется.
Поздравляю, ты открыл для себя детали работы операторов || и && в С и С++.

 как-то обойти? 

bool f1 = func(1);
bool f2 = func(2);
if (f1 || f2)

Можно схитрить и использовать побитовое или вместо логического, но, как минимум, это заслуживает комментария, зачем так сделано:
while (func(1) | func(2))