Есть разница, на низком уровне, между классом со статичными полями и глобальным экземпляром класса?
Нет разницы.

Можно же проверить самостоятельно. Технологии нынче - все легко. Вот: https://godbolt.org/z/PKWPdY4nn

Как видите, и то и другое компилируется в практически одинаковые инструкции:

eax, DWORD PTR MyGlobalPool[rip+4]
...
eax, DWORD PTR MyPool1::numOfAllocatedObjects[rip]

И там и там просто загрузка какого-то статичного адреса глобальной переменной. Вообще говоря, в случае с глобальной переменной компилятор мог бы сдлеать и 2 действия: взять адрес переменной и прибавить смещение поля. Но он, как видите, достаточно умный, чтобы сделать все в одну инструкцию.
Скорее всего низкоуровневой разницы нет, если речь об одном глоб. объекте во втором случае:
https://godbolt.org/z/YaWccvPx3
Мне кажется, если это pool для аллокации памяти и т.д., то предпочтительно ближе ко второму варианту, т.к. можно создавать разные пулы одного типа в одной программе. Скорее даже лучше что-то вроде shared_ptr на pool у аллокатора...