millis() ist nur eine Funktion die einen Wert zurückliefert. Und wenn Du die zweimal direkt hintereinander aufrufst, laufen sie trotzdem nicht gleichzeitig sondern nacheinander.
Erst wenn das erste "nextMillis = millis() + 30000L;" abgearbeitet wurde, wird das nächste "aktualisierung = millis() + 30000L;" ausgeführt. Damit hast Du aber auch noch keine Verzögerung (außer die wenigen Micorsekunden welche die beiden Zeilen zur Abarbeitung benötigen).
Schau Dir mal das Beispiel BlinkWithoutDelay an.