Стандартные потоки ввода, вывода и ошибок создаются при запуске вашего процесса, который в данном случае является вашей C-программой. Когда вы делаете системный вызов, создается другой процесс для выполнения команды date, и он получает свой собственный набор потоков.
В вашей программе вывод printf буферизуется в стандартный поток вывода вашей C-программы. Затем вывод даты буферизируется в свой собственный стандартный поток вывода. Когда системный вызов завершается, стандартный поток вывода даты сбрасывается, поэтому вы видите результат. Затем, когда ваша программа на C заканчивается, ее стандартный поток вывода сбрасывается, и вы видите вывод printf.
Вам может пригодиться сообщение этого сотрудника: http://www.pixelbeat.org/programming/stdio_buffering/