Небольшая модификация того, что сказал Адам :
:set makeprg=[[\ -f\ Makefile\ ]]\ &&\ make\ \\\|\\\|\ make\ -C\ ..
Unescaped, это
[[ -f Makefile ]] && make || make -C ..
что означает стиль псевдокода
if file-exists(Makefile)
then make
else make -C ..
Это только один каталог. Если вы хотите более общее решение, которое пойдет
столько каталогов, сколько необходимо, вы должны будете иметь возможность искать каталоги предков, пока не найдете Makefile, и я не уверен, как это сделать просто из командной строки Но написание скрипта (на любом языке, который вы предпочитаете), а затем вызов его из вашего makeprg не должно быть трудным.