Yes, b2->bar() is safe.
The this pointer inside Derived::bar() points to the start of the Derived object, not just the Base2 subobject.
This is called pointer adjustment in multiple inheritance, and every major C++ compiler (GCC, Clang, MSVC) handles it correctly.