Если есть возможность, попробуйте сами у себя запустить grunt через php. Если получиться, тогда да, буду считать что у меня где то проблема, а не в том, что grunt это баш скрипт и чтобы запустить через php нужно как то выкрутиться.
Данную проблему пытаюсь решить сразу на разных ос: osx, debian там и там без результата.
Видимо вопрос в переменных окружения.
Попробуйте в начале скрипта указать
putenv('PATH=' . getenv('PATH') . ':/usr/local/bin');
И ваш скрипт будет знать, что искать node нужно в /usr/local/bin. Ну или где укажете