Code isn't working without connected Blynk

there is no need to use float variable for timeout, its wrong, just use unsigned long, also mills() returns unsigned long so result of mills()/1000 is unsigned long, to get float you would have to cast both numbers to float. Secondly this is pointless:

while (Blynk.connect() == false) {
    Serial.println("in while: Blink.connect() == false");
    if (((millis() / 1000) - timeout) > 10) {
      break;
    }
  }

This is function in Blynk library responsible for connecting:

bool connect(uint32_t timeout = BLYNK_TIMEOUT_MS*3) {
	conn.disconnect();
	state = CONNECTING;
	uint32_t started = millis();
	while ((state != CONNECTED) &&
	       (millis() - started < timeout))
	{
		run();
	}
	return state == CONNECTED;
}

You can clearly see there is timeout already there… just use it as Blynk.connect(timeout)

And btw your code is not hanging up on Blynk.connect() it just executes the check once or maybe not at all because you wrongly declared timeout float. you should just declare it as global variable float timeout; then later in setup assign (mills() / 1000)