It should work in GNU C:
x = (something) ? ({ a = foo(); baz(a) }) : ({ b = bar(); baz(b); });
However, since all your forms are actually expression statements, we can happily just use the ISO C comma operator:
x = (something) ? (a = foo(), baz(a)) : (b = bar(); baz(b));
If C provided operators for iteration, selection and for binding some variables over a scope (that scope consisting of an expression), everything would be cool. E.g. fantasy while loop:
x = (< y 0) ?? y++ : y; // evaluate y++ while (< y 0), then yield y.
Variable binding:
x = let (int x = 3, double y = 3.0) : (x++, x*y);
The problem is that some things can only be done with statements.
The ternary operator is not actually lacking anything; with the comma operator, multiple expressions can be evaluated. What's lacking is the vocabulary of what those expressions can do.