I actually ended up with this:
val webElement = fluentWait.until(ExpectedConditions.presenceOfElementLocated(By.id(field)).andThen(_.click))
FluentWait requires a Truthy return type and the Unit returned by click is considered Truthy.
If click() throws a StaleElementReferenceException then this is ignored by the FluentWait and we poll again.
I tested this with debug logging and I definitely see the click retrying if the WebElement is stale.
Can anyone comment as to the correctness and safety of this implementation?