Возможность переопределять TObject.NewInstance в ее текущем виде совершенно бесполезна, потому что при этом нет возможности ни передать туда какой-либо аргумент, ни получить тип результата, отличный от TObject. Выделить память на стеке внутри NewInstance нельзя, потому что такая модификация стека сделает невозможным возврат из процедуры.
Единственный работающий вариант собственного распределения памяти для классов - фабрика, выделяющая нужные блоки памяти и вызывающая сначала InitInstance, потом конструктор. При этом запретить создавать те же объекты стандартным способом нельзя, потому что конструктор всегда public.