While self cannot be nil in the constructor the following can happen:
c := TTest.Create; // Allocation fails -> nil is returned
c.DoSomething; // Now nil is passed as self
This is theoretically possible, but in practice not really a problem, because, if the unit sysutils is used anywhere in the program, the Memory Manager will not return nil on error, but throw an exception. So in a "normal" control flow, you only get nil returned by the constructor if the project doesn't use the unit SysUtils. I'm sure there are a few people who use FPC without SysUtils, but the vast majority of users will have SysUtils used atleast in some unit or package. So a silent nil because the memory manager failed, does not really happen in practice.
So while I agree that the fact that self can be nil (or to be more precise, the fact that all pointers are nillable by default) can cause bugs, the thing you specifically are worried about simply does not happen, because thats just not an issue in any real world Pascal projects.