При первом запуске
x=5;
While[x > 0, g[]; x--];
g[]:= Print[x];
ничего не печатается, потому что функция g не была определена до того, как ее использовали.
Во второй раз, когда вы запускаете его, он печатает желаемое значение 5,4,3,2,1, потому что ранее видел определение g.
Вы можете сделать это каждый раз, если определите g перед первым использованием, как это
g[]:= Print[x];
x=5;
While[x > 0, g[]; x--];