In dem Fall ist das Problem, dass zwar normalerweise zwischen nach den Spalten Leerzeichen durch nicht maskierte Zeilenumbrüchen zwischen `\end{column}` und `\begin{column}` gefressen *gefressen* werden, das `\uncover` aber nicht 100% transparent (im Sinne von für den Satz wirkungslos) ist. Der Zeilenumbruch nach der schließenden Klammer von `\uncover<…>{\begin{column}…\end{column}}` ist daher durchaus signifikant. Kommentiert man ihn jeweils aus:
\documentclass[t,aspectratio=169]{beamer}
\usepackage{xcolor}
\begin{document}
\begin{frame}{Titel}
\vspace{\baselineskip}
\begin{columns}
\uncover<2->{\begin{column}{0.5\textwidth}
\textbf{Thema 1:}
\begin{itemize}
\item Punkt 1
\item Punkt 2
\begin{itemize}
\item Unterpunkt 1
\item Unterpunkt 2
\end{itemize}
\item Punkt 3
\end{itemize}
\end{column}}% <-- Hier ein Prozent eingefügt.
\uncover<3->{\begin{column}{0.5\textwidth}
\textbf{Thema 2}
\begin{itemize}
\item Punkt 4
\begin{itemize}
\item Unterpunkt 1
\item Unterpunkt 5
\end{itemize}
\item Punkt 6
\item Punkt 7
\end{itemize}
\end{column}}% <-- Hier ein Prozent eingefügt.
\end{columns}
\vspace{\baselineskip}
\uncover<4->{\begin{itemize}
\item Weiterer Punkt
\end{itemize}}
\end{frame}
\begin{frame}{Titel}
\vspace{\baselineskip}
\begin{columns}
\begin{column}{0.5\textwidth}
\textbf{Thema 1:}
\begin{itemize}
\item Punkt 1
\item Punkt 2
\begin{itemize}
\item Unterpunkt 1
\item Unterpunkt 2
\end{itemize}
\item Punkt 3
\end{itemize}
\end{column}
\begin{column}{0.5\textwidth}
\textbf{Thema 2}
\begin{itemize}
\item Punkt 4
\begin{itemize}
\item Unterpunkt 1
\item Unterpunkt 5
\end{itemize}
\item Punkt 6
\item Punkt 7
\end{itemize}
\end{column}
\end{columns}
\vspace{\baselineskip}
\begin{itemize}
\item Weiterer Punkt
\end{itemize}
\end{frame}
\end{document}
so verschwindet die Verschiebung:
[![Folie 4 und 5 ohne Verschiebung][1]][1]
Ähnliche Probleme sind übrigens auch von `\only` etc. bekannt.
[1]: https://texwelt.de/upfiles/test_20200116_083910.png