One approach, which is nice in theory but might not always be practical, is to make all write operations in the system under test idempotent. That means, assuming your test code tests things in a fixed sequential order, you can retry all reads and all writes individually until you get the result you are expecting, retrying up until some timeout that you define in the test code gets exceeded. That is, do thing A1, retrying if necessary until the result is B1, then do thing A2, retrying if necessary until the result is B2, and so on.
Then you don't need to bother to check for preconditions of write operations, because the write operations will be already checking them for you, and you just retry them until they succeed!
Use the same "default" timeouts as much as possible, that can be increased if the whole system gets slower, and override the defaults individually when retrying particularly slow operations.