Each button announces its state with aria-pressed="true"/"false" — a different value from the aria-expanded a menu item uses, or the aria-checked a checkable menu item uses, because it expresses only two plain states: pressed or not.
It's a specific case of the general pattern covered by this dictionary's "Toolbar" entry, inheriting the same roving-tabindex and arrow-key rules. What sets a formatting toolbar apart is that button state isn't fixed — every time the caret or selection moves, the buttons must recompute "is the spot under the cursor bold?" and resync their pressed state. It's nothing like a menubar — a menubar item opens a submenu when pressed, while a formatting toolbar's buttons toggle their state right where they are, with no submenu (except for an item that genuinely needs a popup, like inserting a link).
The whole button group should be a single Tab stop — arrow keys move between buttons (roving tabindex), and Tab skips the entire toolbar to land on the next widget, the editable content area.