.NET CLR is not specifically "stack-based", due to a number of restrictions and a very limited choice of stack operations. And of course it features local variables (which are virtually the same thing as registers). Most of the .NET JIT implementations would reconstruct expression trees or register assignments from the "stack"-based code. Then the result is going to be translated into an SSA, with no stack operations at all. Since it is not supposed to be interpeted, its "stack"-based nature is totally irrelevant.
JVM is a bit more like a full-blown stack VM, but still most of the JIT compilers would do their best in getting an SSA form (i.e., purely register-based) out of it. A verifyability requirement (and a typed stack) ensures that it is always possible to do so. But when interpreted, JVM could act as a stack machine, with all the advantages and drawbacks. Dalvik developers were interested in the interpretation in the first place, but now, with JITs, their choice of the VM architecture does not make much sense.
If you're interested in the pure stack-based machines, take a look at Forth. Anything else would be a mixture of a sort.