Why doesn't UE utilize STL containers?

Well, that is the dfference between API compatibility and ABI compatibility.
The first one means that you can use the same source of your applications code with every compiler as the interface of the standard library is well-defined and if an implementation isn’t honoring that interface then it simply isn’t a proper implementation of the standard library.
The second means that binaries compiled against one version of one implementation are compatible with binaries compiled against one another version of that implementation or even against a completely different implementation. That is not always the case with the C++ standard library as it is up to an implementation on how to achieve the functionalities that the standard is promising, as long as the result is correct as far as the standard is concerned.

Many things are deliberately undefined i nthe standard not only when it comes to the standard library, but even when it comes to the language itself. For example the size of the built in integer and floating point datatypes is mostly up to the implementation. The standard only guarentees sizeof(long long) >= sizeof(long) >= sizeof(int) >= sizeof(short) >= sizeof(char), sizeof(long double) >= sizeof(double) >= sizeof(float) and sizeof(unsigned type) == sizeof(signed type), but not the exact size, so that in the wild short is normally 16bit, but 64bit on UNICOS, int is sometimes 16 bit (when compiling for 16bit OS), sometimes 32bit (32bit OS and Windows and Unix 64bit), sometimes 64bit (Sparc64, UNICOS), long is sometimes 32 (32bit OS and 64bit Windows), sometimes 64bit (64bit Unix, Sparc64, UNICOS), yeah, there have even been systems around, where char has been 7bit or 12bit.

So why is the standard deliberately leaving such important things up to the implementation?
The reasons are performance and flexibility. This way C++ programs can achieve optimal performance even for extremely low level code on every hardware and OS, no matter the memory model or the processor. Keep in mind that C++ is a langauge that can be used for pretty much everything, not only desktop and mobile, but also mainframes or embedded systems and there are situations when a hardware manufaturer has the choice between an implementation that behaves in a more standard way and one that saves incredible amounts of money through non-standard optimizations. For example modern cars have literally thousands of embedded computers in their electronic systems, with price and size limitations that don’t always allow implementing things the usual way.