Das kann nicht funktionieren. Die `sagetex`-Anweisung `\sage` ist wie folgt definiert:
\newcommand{\sage}[1]{\ST@wsf{%
try:^^J
_st_.inline(\theST@inline, #1)^^Jexcept:^^J
_st_.goboom(\the\inputlineno)}%
\ifST@paused
\mbox{(Sage\TeX{} is paused)}%
\else
\begin{NoHyper}\ref{@sageinline\theST@inline}\end{NoHyper}
\@ifundefined{r@@sageinline\theST@inline}{\gdef\ST@rerun{x}}{}
\fi
\stepcounter{ST@inline}}
Schon ohne dass wir uns anschauen müssen, was `\ST@wsf` macht, können wir sehen, dass das Ergebnis des `\sage`-Aufrufs keine Zahl ist, sondern entweder eine Box mit Text zuzüglich der Erhöhung eines LaTeX-Zählers oder aber eine Gruppe mit einem Querverweis eventuell mit einer zusätzlichen Definition und wieder zuzüglich der Erhöhung eines Zählers. Nicht nur die Zusätze wie die Erhöhung des Zählers und ggf. die Definition des Makros `\ST@rerun` stören dabei. Natürlich stört auch die Umgebung `NoHyper` und selbst `\ref` liefert nicht unbedingt eine Zahl zurück.
Dein Beispiel läuft also im besten Fall auf etwas wie:
\documentclass[12pt]{article}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.12}
\newenvironment{NoHyper}{}{}
\newcounter{testzahl}
\begin{document}
\refstepcounter{testzahl}\label{testzahl}
\pgfplotstabletypeset[sci zerofill]{
x 0.1 0.2
1 \begin{NoHyper}\ref{testzahl}\end{NoHyper}\stepcounter{testzahl} 1.2
2 2.1 2.2
}
\end{document}
hinaus. Hier leuchtet vermutlich jedem schnell ein, dass das nicht funktionieren kann.
Will man also mit `sagetex` Werte berechnen, die man mit `pgfplotstable` oder `pgfplots` verarbeiten will, statt diese Werte direkt mit `pgfplots` selbst oder mit Lua zu berechnen, so bleibt IMHO nur, die Werte vorab zu berechnen und beispielsweise die plot-Daten in eine Datei zu schreiben.
schreiben, die dann mit `pgfplotstable` (oder `pgfplots`) gelesen wird.