It's not UB to #include standard headers that do such things. It is UB to #undef or redefine them yourself, though. And it looks like <stdbool.h> gets an explicit exemption, at least in C11:
"Notwithstanding the provisions of 7.1.3, a program may undefine and perhaps then redefine the macros bool, true, and false"
I guess it's because defining these was so common even before C99. But there's no similar verbiage for <iso646.h>, so...
When I do #include <stdbool.h> it also brings the #define bool _Bool, a keyword from the standard library.
How is it UB?