I ended up here (and would have suggested this idea otherwise) because I found myself with precisely the issue that this operator would neatly address: I want to coalesce/chain into an expression which uses a value (if it exists), else short-circuit and return null/undefined, and also more generally not have to keep track of which (or, perhaps worse, check verbosely for both separately). I think that the 'Celsius → Farenheit' example in dustbort's linked thread is a sensible such use case: one value depends upon another; we have good reason to preserve nullish coordinate values; and we really don't want to be instantiating a Celsius class and optionally chaining a toFarenheit method for such a simple system.
!? as a 'non-nullish coalescing' (or 'existence coalescing'?) operator fits a niche—nay, a hole—in the language: it's a completely natural complement/inversion to ??, pairs consistently with ==/!=, introduced no syntax/parsing ambiguities, and, as far as I can tell, only obviously precludes ! as a potential future postfix unary operator (in conjunction with ternary or optional chaining). Easy parsing, too, since it branches off ! for a maximum of one character before resolving, and doesn't mess with ternary parsing at all.
?! would make succinct nullish handling slightly more robust (see: the many threads about null/undefined handling (complete with obligatory mentions of document.all)), and more importantly, it makes the intent of such code much clearer: && communicates "must be truthy," while !? would communicate "it just has to exist"—much as ?? communicates a default/fallback expression ("if it doesn't exist then...") distinctly from || ("if it isn't truthy then...").
One more benefit that I think is worth mentioning and makes this proposal more than syntactic sugar: it obviates repetition of the first operand to preserve its value: the only equivalent that we seem to have for the proposed a !? b right now is a ternary on a != null ? a : b (or equivalent for the condition), which requires repeating a. From what I can tell, that's pretty much the whole case behind the pipe operator—not needing intermediate assignments—and I think that it's a good reason. Being able to cleanly carry a value within an expression without needing to give it a name makes a massive difference for clarity and maintainability, in the 'if considered harmful' sense, much as the ternary operator lets us avoid repeating the left-hand assignment, or calling function/method (and any other arguments), or whatever context the ternary is being used in.
For completeness, while !?= might seem a little 'cute', I think it might situationally be serve as a convenient, succinct, clear 'unset'/'reset to default' (if initialised) operator. One might wish to be able to reset a field (which may or may not be 0 or false, so &&= wouldn't work, in the same way that one can't use && for robust non-nullish coalescing) to some default value (which could be anything, not just null or undefined), but only if the value has been set (so ||= wouldn't work, because it would reassign nullish values). Perhaps this might occur for an update method in a class instance which hasn't finished initialising—or something vaguely like that, where multiple asynchronous parts are interoperating and smooth, clean sequential execution can't be guaranteed. Alternatively, reverting an optional field to a default/provided value, but only if it's supplied in the first place. I can imagine applications where the resulting code is cleaner and more legible, and despite my efforts I don't see any significant potential downsides. Am I missing any?
Re. the pipe argument: I really like the pipe operator proposal, but it shouldn't subsume this suggestion, just as it shouldn't replace &&; a proposed 'base-level' operator shouldn't be bundled into the pipe mechanism in the same way that operator-assignment shouldn't be bundled with the operator itself. Piping is already a variation of sorts on expression chaining using logical operators, optional chaining, and such: I like the idea of a complementary 'optional pipe' operator, but having a 'regular' non-nullish coalescing operator (or 'existence coalescing operator') would still serve sensible use cases and 'fill out' a natural, existing design space in the language.
As a side-note, for posterity, I agree that ?? is an unfortunate token, but for a different reason: I think that !? makes the more natural choice for the nullish-coalescing operator:
a?.b → a? ("a exists / has a value?") If so, then .b
a ? b : c → a? If so, then b, otherwise (:) c
a ?? f(a) → If a has a value (isn't nullish), then f(a) (akin to && returning the second operand if the first is truthy)
a !? b → If a not (!) exists (?) then b instead (akin to || returning the second operand if the first is falsey)
The ternary operator already associates the immediate succedent of ? with truthy values (for the first operand); optional chaining only proceeds the chain if the value 'exists'. (We could have 'nullish' and 'exists' as coordinates to 'falsey' and 'truthy'.) For what it's worth, I more naturally read a !? ( ... ) as "No a?! In that case, (...)"
Considering that optional attribute access is ?. (rather than .?), I think that ?& and ?| would make for more coherent aliases (at best) for non-nullish coalesceing and nullish-coalescing respectively: 'exists and' and 'exists or/else' respectively. Since we already have ??, though, I think that's no longer likely.
Still, the next best option still to be 'completing the set' with !? and !?=, n'est-ce pas?