Arduino locks up, powering down doesn't fix but serial monitor does

Since there seems to be some doubt about whether the unit is being back powered, next time it happens pull the Uno's reset pin to LOW for a couple of seconds instead of removing the power. See if the behaviour is any different.

If you think there are memory issues that result in the unit failing, then try sticking a line like this:

volatile byte wasteSpace[1600];

at the beginning of your sketch. Waste the most of your device's RAM with this, but leave enough for the sketch to run with some room. Test while connected to your computer. If memory is causing a problem, this should cause it to fail sooner and give you more opportunities to debug.

  status = esp8266.begin();
  if (status <= 0)
  {
    Serial.println(F("Unable to communicate with shield. Looping forever."));
    while(1) ;
  }

These empty infinite while loops aren't great for error conditions. Instead, use digitalWrite() and delay() with the onboard LED to generate flash codes inside of the while.

Maybe if I routinely cycle power before it happens (like put a timer on the electrical outlet that turns off power every week), I can at least keep it running

Pre this last resort, you could also enable the hardware watchdog on your Uno with a few small additions to your code. Better to fix any errors first if you can though.