* When generating test data is tricky: Sometimes, being able to come up with valid, non trivial test data is a challenge in itself.
When you need the system to be "in context" with "full data set" then what you are doing is not unit testing. It's testing, but you strain the "unit" bit quite a lot. You need to have smaller tests for that. The hard thing with TDD is getting your code in such a shape that you can test it in the small. It is valuable, but not easy. If you do test-after (which is NOT TDD) then it's almost impossible to avoid your situation.
So when you want to test something larger than a unit (ie a method on a class) then you will want to use something like UATs or the like. But in that scenario, you still want tests on individual functions as you would have if you practice TDD.
* When the only practical way of verifying correctness of the code is to run it.
But the code is running in the unit test. Do you mean when it's running in context or something else?
* When you're testing visual elements of the design.
I thought this is what your second bullet point was getting at, but I guess not. It is hard and often unrewarding to try to test layout in UTs. Such tests are fragile.
So it may not be valuable to use UT to do large subsystem tests or to verify screen layout in some circumstances. But even if so, it is incredibly valuable for the 90% of your work that remains.