Well, if the shorten routine provided by TikZ does not do what you want, you may build your own. Here is a proposal inspired by this answer. The idea is to measure the length of the path and then switch the drawing off and on. (UPDATE: Add dash phase=0.0001pt
, a trick discovered by the OP, that avoids a very tiny point at the beginning of the path, which I failed to spot when I posted the earlier versions of this answer.)
\documentclass[border =3mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{decorations.markings}
\newlength\mylen
\newlength\vislen
\newlength\hidlen
\tikzset{
mid arrow/.style={postaction={decorate,decoration={markings,mark=at position .35 with {\arrow[#1]{stealth}}}}},
connect/.style={
decoration={
markings,
mark=at position 0.5 with {
\node[draw=none,inner sep=0pt,fill=none,text width=0pt,minimum size=0pt]
{\global\setlength\mylen{\pgfdecoratedpathlength}
\pgfmathsetmacro{\hiddenlength}{#1 mm}
\global\setlength\hidlen{\hiddenlength pt}
\pgfmathsetmacro{\visiblelength}{\pgfdecoratedpathlength-2*\hidlen}
\global\setlength\vislen{\visiblelength pt}
};
},
},
preaction={decorate},
dash pattern=on 0pt off \hidlen on \vislen off \hidlen,
dash phase=0.0001pt,
out=0, in=180, looseness=2},
}
\begin{document}
\begin{tikzpicture}
\coordinate (A) at (0,0); \coordinate (B) at (2,1);
\path[draw=blue] (A) edge[mid arrow=red, connect=1] (B);
\path[draw=orange] (B) edge[mid arrow=black, connect=0] (A);
\end{tikzpicture}
\end{document}

Let me stress that this is not a real alternative of TikZ' shorten (yet). For instance, if you were to add arrow heads by simply saying \draw[->]
, this won't work, i.e. the arrow heads would just sit at the position of the target, but a bit of the curve would be missing. (However, you could of course easily add arrow heads wherever you want them.)
ADDENDUM: Just for fun, added a more flexible style myconnect
which allows one to skip different amounts at the beginning and at the end of the path, and also double-checked that for curves with controls everything works fine.
\documentclass[border =3mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{decorations.markings}
\newlength\mylen
\newlength\vislen
\newlength\hidlen
\newlength\firstlen
\newlength\secondlen
\tikzset{
mid arrow/.style={postaction={decorate,decoration={markings,mark=at position .35 with {\arrow[#1]{stealth}}}}},
connect/.style={
decoration={
markings,
mark=at position 0.5 with {
\node[draw=none,inner sep=0pt,fill=none,text width=0pt,minimum size=0pt]
{\global\setlength\mylen{\pgfdecoratedpathlength}
\pgfmathsetmacro{\hiddenlength}{#1 mm}
\global\setlength\hidlen{\hiddenlength pt}
\pgfmathsetmacro{\visiblelength}{\pgfdecoratedpathlength-2*\hidlen}
\global\setlength\vislen{\visiblelength pt}
};
},
},
preaction={decorate},
dash pattern=on 0pt off \hidlen on \vislen off \hidlen,
dash phase=0.0001pt,
out=0, in=180, looseness=2},
}
\tikzset{myshorten/.style n args={3}{#1,
decoration={
markings,
mark=at position 0.5 with {
\node[draw=none,inner sep=0pt,fill=none,text width=0pt,minimum size=0pt]
{\global\setlength\mylen{\pgfdecoratedpathlength}
\pgfmathsetmacro{\hiddenlength}{#2}
\global\setlength\firstlen{\hiddenlength pt}
\pgfmathsetmacro{\hiddenlength}{#3}
\global\setlength\secondlen{\hiddenlength pt}
\pgfmathsetmacro{\visiblelength}{\pgfdecoratedpathlength-\the\firstlen-\the\secondlen}
\global\setlength\vislen{\visiblelength pt}
};
},
},
preaction={decorate},
dash pattern=on 0\mylen off \firstlen on \vislen off \secondlen,
dash phase=0.0001pt
}
}
\begin{document}
\begin{tikzpicture}
\coordinate (B) at (2,1); \coordinate (C) at (5,5);
\path[draw=red] (B) edge[mid arrow=blue,myshorten={out=0, in=180, looseness=2}{5mm}{7mm}]
(C);
\end{tikzpicture}
\begin{tikzpicture}
\coordinate (B) at (2,1); \coordinate (C) at (3,5);
\draw[gray,connect=0] (B) .. controls ++(0:1.75) and ++(180:1.75) .. (C);
\draw[mid arrow=red,connect=10] (B) .. controls ++(0:1.75) and ++(180:1.75) .. (C);
\end{tikzpicture}
\end{document}

The gray curve in the right picture is just to verify that the curve does not get deformed.