Apologies for not helpfully answering the question posed, but hoping this might help anyway...
Instead of something "similar to the first", I'd likely use something that (I think) is simpler than either of them.
Your first example macro-"expands" to code that I think is clearer, than either of your examples:
(macroexpand '(if-let* ((foo (get-foo))
(_ (conditionp foo))
(bar (get-bar-from-foo foo)))
X))
gives:
(let* ((foo (and t (get-foo)))
(_ (and foo (conditionp foo)))
(bar (and _ (get-bar-from-foo foo))))
(if bar X))
If I were to code that expansion by hand it would be simpler still:
(let* ((foo (get-foo))
(_ (and foo (conditionp foo)))
(bar (and _ (get-bar-from-foo foo))))
(if bar X))
And that assumes that the sexps would in reality be more complex. Otherwise I'd probably just use something like this:
(let ((foo (get-foo)))
(and foo (conditionp foo) (get-bar-from-foo foo) X))
Even just a structural comparison of that with the if-let*
form shown in @Basil's answer shows that the above sexp is simpler. Remove everything except the parens from each, to compare:
(((())(())(()))) ; Simplified `if-let*` form (@Basil's answer)
(((()))(()())) ; Simple `let` shown above