You can query the historical/archived states as well, but most of the servicehub calls are for the latest states in the vault. You can also query the transactions directly and create a table of transactions (the transaction graphs are saved).
If you’d like to alter this example, you can write your own flow that does a copy of the new state with a new field for “status” and that would mean the states are not consumed, but both states are updated in a single transaction.
More broadly, any transaction can encompass multiple state transitions through the contact code commands. The TwoPartyDealFlow is executing two state changes - one updating the ownership of the CP_STATE to the buyer and another one taking the price of the CP_STATE and sending the cash from the buyer to the seller.