The only solution I've found so far is a total hack:
Instead of using a full detent, use context.maximumDetentIdentifier to ensure the detent is never actually full:
sheet.detents = [.custom(resolver: { context in
0.999 * context.maximumDetentValue
})]