As someone already pointed out: Don't expect undefined behavior to be reproducible.
That said, there are a lot of variables. Of course there are the obvious ones (like CPU architecture / 32 bit or 64 bit mode; exact versions of the OS or other software involved (like .NET); etc.) but there also are the more subtle ones. Like how much memory the process is given at a time when it asks for some or even how much it asks for at a time.
So if you check how much virtual memory the process has on different machines before crashing, and the numbers are different, this can be a good reason for it crashing on one system but not the other.
How much memory the process is given at a time can depend on a lot of different factors like how much physical memory is available, how much swap space is available, which swap strategy is used, how the memory is currently allocated, etc. If you tested it on a machine with 16 GB of ram 10 times with it currently using 1 GB of ram for the OS and other applications and the process not crashing, you didn't really reproduce that behavior reliably. You kept the variables relatively constant. It might very well crash all 10 times on a machine with the exact same software but only 4 GB of ram and using 3 GB of it.