После этой строки
return isOdd(node->child);
вводится следующая, потому что, как прокомментировал Иксисарвинен, после выполнения одного оператора return
функция выполнена, больше ничего не будет выполнено.
Т.е.
return isOdd(node->sibling);
не повлияет на результат, т.е. брат игнорируется.
Чтобы всегда возвращать что-то, на что влияют обе части, вам нужна логическая c операция
return (isOdd(node->sibling) && isOdd(node->child));
С другой стороны, ваш код
if (!node) return true;
мне кажется вполне подходящим. Если вы анализируете указатель, который указывает на ничто (без разыменования, хорошо), то имеет смысл сказать, что «ничто» не может сломать «все странное», поэтому возвращение true имеет смысл для меня.