I'd go with this, which I find the easiest to read:
x = foo01();
foo03(x, foo02(x));
In my head I tend to see code as a directed graph, and this one most closely matches that graph without creating too big a jumble on one line. The first one that also has y and z has additional nodes and edges, making the graph more complicated than it needs to be.
Your second one would have the simplest graph, except on one line like that it obscures that foo01() is called twice. If that second one was actually foo04(), then I'd prefer this as the simplest form (which I'd actually originally written before noticing foo01() was in there twice), because it has the simplest directed graph of all, and the code matches it very closely:
foo03(
foo01(),
foo02(foo04())
);
If the variables and function names were long enough, then I'd use that last format even with my first example, to avoid the whole "jumble of letters and numbers" while still keeping the directed graph simple:
the_big_x = the_big_foo01()
zimzamfoo03(
the_big_x,
bang_bar02(the_big_x)
);