Change vertical space in overset

To get better horizontal spacing of the \oset macro -- specifically, to make its spacing the same as that of a "relational operator" (which is the case for \to) -- you could encase the macro's definition in a \mathrel wrapper.

To make the \oset macro usable for different symbols/letters in the base and superscript positions, it's necessary to introduce a third, optional, argument: the argument of \vbox. Its default value, 0pt is suitable for single uppercase letters in the superscript position and arrows in the base position. For other combinations, you'll need to experiment a bit to find the suitable distance by which the superscript term should be raised; the values given in the example below may be OK for the selected math font (newpxmath). Different values will probably need to be chosen if you use a different math font.

enter image description here

\documentclass[11pt]{book}
\usepackage[utf8]{inputenc} 
\usepackage[T1]{fontenc} 
\usepackage{booktabs} % for '\midrule' macro
\usepackage{amsmath}  % for '\overset' macro
\usepackage{newpxmath,newpxtext}

% new \oset macro:
\makeatletter
\newcommand{\oset}[3][0ex]{%
  \mathrel{\mathop{#3}\limits^{
    \vbox to#1{\kern-2\ex@
    \hbox{$\scriptstyle#2$}\vss}}}}
\makeatother

\begin{document}
\[
\begin{array}[t]{@{}c@{}}
\text{with \texttt{\string\overset}}\\
\midrule
X_n\overset{P}{\to} X \\
X_n\overset{D}{\to} X \\
X_n\overset{j}{\to} X \\
X_n\overset{\text{rth}}{\to} X \\
X_n\overset{\text{i.i.d.}}{\sim} X
\end{array}
\qquad
\begin{array}[t]{@{}c@{}}
\text{with \texttt{\string\oset}}\\
\midrule
X_n\oset{P}{\to} X \\
X_n\oset{D}{\to} X \\
X_n\oset[.35ex]{j}{\to} X \\
X_n\oset[.45ex]{\text{rth}}{\to} X \\
X_n\oset[.6ex]{\text{i.i.d.}}{\sim} X
\end{array}
\]
\end{document}

I came around \lower and \raise TeX "primitives" here at https://www.tug.org/utilities/plain/cseq.html. And manually lower and raise a box in the \overset works fine for me.

\overset{\lower.5em\hbox{aaa}}{bbb}