It depends on what you mean by condition: a predicate specifically or just any expression that is appropriate where a condition is expected by the surrounding context.
From the former point of view, I'd say that it is never appropriate to use comma to separate conditions. A condition is, by natural definition, an expression that is valuable specifically for its boolean result and not for its side effects (if any). Comma operator always ignores the results of all of its operands with the exception of the very last one. That immediately means that there's no meaningful way to specify a condition anywhere except for the very last position in the comma-separated sequence.
The first and intermediate operands of comma operator are supposed to be expressions whose whole purpose is in their side-effects. It is hardly justified to refer to such expressions as conditions since their results are ignored.
From the latter point of view, it might indeed make sense to include such side-effect producing sub-expressions in contexts where conditions are expected (like the middle segment of the for cycle header), but in many cases they lead to rather ugly code.
One semi-viable example I can come up with might look as follows
for (ListItem* ptr = list_header;
assert(ptr != NULL), ptr->key != target_key;
ptr = ptr->next);
which is supposed to emphasize the fact that the list absolutely must contain the target_key (i.e. the cycle must never fall off end of the list). But I would personally express it differently.
The transformation in your example with while(function1(), function2(), function3()) is not equivalent, since in general case function3() might depend on the side effects of function1(), function2(). This would mean that the ordering of these calls cannot be changed, which is probably the main reason they all were stuffed into the while condition in the first place. In such situations it might make sense to express it as while(function1(), function2(), function3()), but I'd rather transform it into
do
{
function1();
function2();
if (!function3())
break;
...
} while (true);