How do I draw on images embedded with \includeimage in TikZ with pixel accuracy?

You're trying the right thing, but the coordinate calculation syntax is a bit limited: it expects the factor for stretching the vector to appear at the start of the expression. So you could use

\begin{scope}[x={($1/800*(image.south east)$)},y={($1/600*(image.north west)$)}]

However, it turns out that apparently this approach has some precision issues, with the resulting coordinate system not matching the image exactly.

So instead, you might want to use cfr's approach from https://tex.stackexchange.com/a/269850/2552, which works without problems for me (but involves more typing):

\documentclass[tikz, demo]{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}

\newlength\iwidth
\newlength\iheight
\settoheight\iheight{\includegraphics{example-image}}
\settowidth\iwidth{\includegraphics{example-image}}

  \begin{tikzpicture}[x=\iwidth/800, y=\iheight/600]
    \node[anchor=south west,inner sep=0] (image) at (0,0) {\includegraphics{example-image}};
      \draw[color=red] (0, 0) rectangle (800, 600);
  \end{tikzpicture}
\end{document}

Edit: In the first version of my answer -- as pointed @Jake in his comment -- I miss the point in the question ... so here is corrected solution, inspired by @Jake answer:

    \documentclass{article}
    \usepackage{tikz}
    \usepackage{calc}
    \usepackage{graphicx}

\begin{document}
    \begin{figure}
\centering
\sbox0{\includegraphics[width=0.5\textwidth]{example-image}}%
\begin{tikzpicture}[x=\wd0/800, y=\ht0/600]
\node[anchor=south west,inner sep=0pt] at (0,0){\usebox0};
\draw[blue] (200,100) rectangle + (500,300);
\draw[red,thick] (0,0) rectangle + (800,600);
\end{tikzpicture}
    \end{figure}
\end{document}

Main difference is that instead new lengths is used box0 and possibilities which it offer. With this above code is somewhat shorter but gives equal result:

enter image description here

Addendum: Let be noted, as say @jfbu in his comment: "... \box0 is sometimes a bit dangerous especially if you delay use of \wd0 or \ht0. It is safer to do \newsavebox\mybox and use \sbox\mybox, \wd\mybox ... ". So, although till to now I haven't bad experiences with box0, it is better to stay on safe side of LateX use, and rewrite above MWE into:

\documentclass{article}
    \usepackage{tikz}
    \usepackage{calc}
    \usepackage{graphicx}

\newsavebox\mybo

% for show only a figure
\usepackage[active,floats,tightpage]{preview}
\PreviewBorder{1em}

\begin{document}   
    \begin{figure}[h]
\centering
\sbox\mybox{\includegraphics[width=0.5\textwidth]{example-image}}%
\begin{tikzpicture}[x=\wd\mybox/800, y=\ht\mybox/600]
    \node[anchor=south west,inner sep=0pt] at (0,0) {\usebox\mybox};
    \draw[blue,very thin] (200,100) rectangle + (500,300);
    \draw[red,thick] (0,0) rectangle + (800,600);
\end{tikzpicture}
    \end{figure}
\end{document}

The bots solution has important advantage: The image is processed ony ones (when storing in save box and than used as \usebox\mybox or in accordance of the first example as \usebox0. This potentially reducing compilation time (as also stated @jfbu in his comment).