В том же Visual C++ 2012 NULL определен как
#define NULL 0
Т. е. в итоге, после обработки исходного файла препроцессором, второй вариант превращается в первый.
Каноничный вариант объявления чисто виртуальной функции:
virtual void fool() = 0;
по сути и является правильным, т. к. в зависимости от реализации компилятора и библиотек, макроопределение NULL может быть определено по другому.
Попробуй создать пустой проект, добавь к нему файл .cpp с определением класса:
class Foo { virtual void foo() = NULL; };
int main() { }
без включения любых заголовочных файлов (без #include).
Он просто не будет компилироваться, т. к. компилятор в данном случае ничего не знает о NULL. Замени NULL на 0 и все заработает.