You can force the two arrows to be on the same level by adding a \vphantom instruction in the argument of the first \overrightarrow instruction. "vphantom" is short for "vertical phantom"; a vertical phantom has no width (and is therefore invisible) and has the same height and depth as its argument. For your purposes, the argument of the \vphantom command may simply be the character used in the second \overrightarrow command.
\documentclass{article}
\begin{document}
$\overrightarrow{a\vphantom{b}} \otimes \overrightarrow{b}$
\end{document}

Addendum: If you find yourself using a lot of \overrightarrow instructions and don't wish to have to keep track of whether the heights of some of the arrows have to be adjusted, you could create a command such as \rarrow (short for "right arrow"):
\newcommand{\rarrow}[1]{\overrightarrow{#1\vphantom{b}}}
Here, b is chosen as the argument of the \vphantom command because it has a full-height ascender. The preceding MWE could then be rewritten as
\documentclass{article}
\newcommand{\rarrow}[1]{\overrightarrow{#1\vphantom{b}}}
\begin{document}
$\rarrow{a} \otimes \rarrow{b}$
\end{document}
Further addendum, prompted by a great comment by @sigur: To address the possibility that both elements of the tensor product consist of characters that either do not contain ascenders or only half-height ascenders (such as "t" and "j"), you could define a command named, say, \tensorpr, as follows:
\documentclass{article}
\usepackage{amsmath} % for less-cramped positioning of arrows
\newcommand{\tensorpr}[2]{\overrightarrow{#1\vphantom{#2}}
\otimes \overrightarrow{#2\vphantom{#1}}}
\begin{document}
$\tensorpr{a}{b}$
\end{document}
Note the symmetric use of the \vphantom instructions. By the way, I'd recommend using the amsmath package because it causes the arrows to be typeset ever so slightly higher above their arguments, leading to a less "cramped" look.