I found a work-around if you’re building from source:
OpenXRInput.cpp
void FOpenXRInputPlugin::FOpenXRInput::SetHapticFeedbackValues(int32 ControllerId, int32 Hand, const FHapticFeedbackValues& Values)
...
HapticValue.duration = MaxFeedbackDuration/20.0;
...
What’s happening is that the Haptic duration is always set to 2.5 seconds. On the Vive Wands they are continuing to rumble for this time.
This is a work-around as the stop haptics function (xrStopHapticFeedback) should work for the Vive OpenXR implementation and isn’t stopping the haptics.