I have not had time to look at your code in detail but this line stood out
if (startMillis - currentMillis >= ScreenRefresh)
If the variable names reflect the data they hold then the logic is wrong.
When using millis() for timing you need to check whether a certain period of time has passed since something occurred. This is best done by subtracting the start time from the current time and comparing it with the required timing period. You seem to have done this the wrong way round based on the variable names.
Replacing delay() with millis() timing in your code to refresh screen 2 when it is being displayed should be simple. When you first move to screen 2 set ScreenTwo HIGH and save the start time and call CoopDoor(). Then, independent on any other code do this in loop()
if (ScreenTwo == HIGH) //if we are showing screen 2
{
if (currentMillis - startMillis >= ScreenRefresh) //if the period has passed
{
ShowCoop(); //refresh the screen
startMillis() = currentMillis(); //save the time that it was refreshed
}
}