what memory order(s) should I use for a load followed by a compare exchange?
It is impossible to tell because you don't show the code where update() is called.
Reordering of memory operations surrounding that call is a real thing on certain platforms if you use memory_order_relaxed (or anything weaker than the default for that matter).
high_water may actually be used to synchronize data between threads. If you are not worried about those possible reorderings, then std::memory_order_relaxed is fine.
Generally, for these kinds of operations, I would not use a weaker ordering than the default (std::memory_order_seq_cst).
Since std::compare_exchange_strong is a Read-Modify-Write (RMW) operation, which by definition is expensive because it synchronizes the value of the atomic between cores,
changing memory ordering is not going to be much of an advantage. At least on X86, with your code, the compiiler will emit the exact same object code for std::memory_order_seq_cst and std::memory_order_relaxed.
Side note, since you are in a loop, you may want to use compare_exchange_weak(), which may fail spuriously, but that is handled by the loop.