I'm posting what I've found here in case it is of future use to others
After much time and effort, I've found a couple solutions. Take them with a grain of salt, I'm somewhat of a novice.
First, it doesn't appear to be possible to write to the register that contains the encoder value so it can't be reset that way.
Second, this may be obvious to experienced folks, but it took me a bit to figure it out. This can be used to get a value that follows the encoder but can be reset to zero;
The current encoder value should be stored as a signed 32bit value. Probably an XL or an ML.
Create an offset value by writing one time the current encoder value to another singed operand.
Create a replacement encoder value in another singed operand.
Always subtract the offset from the current encoder value to get the replacement encoder value.
This will give you a value that always follows the encoder value but at a calculated offset. Anytime the offset is recalculated the result will be zero in the replacement encoder value. Hence a value that follows the encoder but can be reset to zero in logic. No it's not perfect, but it works pretty well.
Third, another way that the encoder value can be reset is by changing it's config. Yes this is probably far from ideal, but could be useful by quickly changing config and changing back. I didn't fully explore which configs will result in a reset value, but it was repeatable.
Good luck.