Дело в том что интерпретатор JS не понимает, что текст нужно поменять после окончания скрытия. Для того чтобы это произошло нужно выполнить callback функцию после скрытия.
$("#q").hide(1000,function(){
$(this).text("NEW TEXT").show(1000);
});
Я думаю связано это с тем, что при использовании .hide и .show используется тайм-аут, а это автоматически переводит эти инструкции в конец стека вызовов. Вот и получается, что инструкция .text в Вашем примере выполнится быстрее скрытия. Я думаю, что разработчики jQuery именно поэтому предоставляют возможность указывать коллбэк для таких методов как animate, hide, show