tblr typesets its content apparently at least three times (for measurement) before its actually put on the page.
- The chain starts outside of your TikZ picture, so all those 4×2 nodes are considered part of one and the same chain.
- PGF/TikZ doesn't really check whether a referenced node is part of the same picture.
The “D” node you finally see on the page isn't placed at (0, 0) either, it is placed right of the last N node of the previous picture.
Take a look at the following example. tblr is basically doing the same, four times the same diagram:
\tikzset{
node distance = 0mm and 5mm,
start chain = going right,
N/.style = {fill=#1!20, name=N,
inner ysep=4mm, inner xsep=0mm, minimum width=22mm,
on chain, join=by -Straight Barb}
}
\tikzset{every picture/.append style={
execute at end picture={
\node[circle, draw, label=$O$] at (0,0) {};
\draw[help lines] (-1.25,0|-N.south west) grid (N.north east);}}}
\tikz[baseline=(N.base)]{
\node[N=red]{D \pgfpictureid\ \tikzchaincount};
\node[N=blue]{E \pgfpictureid\ \tikzchaincount};}
\tikz[baseline=(N.base)]{
\node[N=red]{D \pgfpictureid\ \tikzchaincount};
\node[N=blue]{E \pgfpictureid\ \tikzchaincount};}
\tikz[baseline=(N.base)]{
\node[N=red]{D \pgfpictureid\ \tikzchaincount};
\node[N=blue]{E \pgfpictureid\ \tikzchaincount};}
\tikz[baseline=(N.base)]{
\node[N=red]{D \pgfpictureid\ \tikzchaincount};
\node[N=blue]{E \pgfpictureid\ \tikzchaincount};}
\tikz % this picture doesn't have a node N but it still finds it.
\draw foreach \ang in {0, 15, ..., 359} { (N.\ang) -- ++(\ang:5pt)};
This gives:

I've added the origin and a grid to all diagrams so that you can see more clearly what's actually happening.
The manual states for start chain:
This key should, but need not, be given as an option to a scope enclosing all nodes of the chain. Typically, this will be a scope or the whole tikzpicture, but it might just be a path on which all nodes of the chain are found. If no chain name is given, the default value chain will be used instead.
which is not really clear but gives a hint that it maybe should only used on a per pictures basis. Though, it surely didn't forsee a picture being typeset four times.
Anyway, I'd recommend putting start chain at the \tikz picture or at least in the tblr cell. A chain between pictures doesn't really make sense anyway.
I've added a reset chain key that resets the given chain (or the active chain if no value is given), which we could add to every picture but I wouldn't use it. (It's also missing a check whether the given chain even exists.)
Code
\documentclass{article}
\usepackage{tabularray}
\usepackage{tikz}
\usetikzlibrary{arrows.meta, chains, positioning}
\makeatletter
\tikzset{
reset chain/.code=%
\expandafter\gdef\csname tikz@lib@chain@count@#1\endcsname{0},
reset chain/.default=\tikz@lib@current@chain}
\makeatother
\begin{document}
\tikzset{
node distance = 0mm and 5mm,
% start chain = going right,
N/.style = {fill=#1!20, name=N,
inner ysep=4mm, inner xsep=0mm, minimum width=22mm,
on chain, join=by -Straight Barb}
}
\begin{tblr}{colspec = {Q[l,m] X[l,m]}}
DE & \tikz[start chain=going right, baseline=(N.base)]{
\node[N=red] {D}; \node[N=blue] {E};}
\end{tblr}
\hrule
\begin{tblr}{colspec = {Q[l,m] X[l,m]}}
DE & \tikzset{start chain=going right}
\tikz[baseline=(N.base)]{\node[N=red] {D}; \node[N=blue] {E};}
\end{tblr}
\hrule
\tikzset{start chain=going right, every picture/.append style=reset chain}
\begin{tblr}{colspec = {Q[l,m] X[l,m]}}
DE & \tikz[baseline=(N.base)]{\node[N=red] {D}; \node[N=blue] {E};}
\end{tblr}
\end{document}
Output

You could also use the graphs library were you also can kind of set up the placement and connection strategy beforehand. (Though, I would specify this as part of the \tikz or \graph instead of global.)
Since the nodes D and E are not connected by -- or similar, these are considered sibling and thus branch right sep is used not grow right sep.
\documentclass{article}
\usepackage{tabularray}
\usepackage{tikz}
\usetikzlibrary{arrows.meta, graphs}
\begin{document}
\tikzset{
N/.style={
fill=#1!20, inner ysep=4mm, inner xsep=0mm, minimum width=22mm, alias=N}}
\tikzgraphsset{branch right sep=5mm,
every graph/.append style={path, ->, /tikz/>=Straight Barb}}
\begin{tblr}{colspec = {Q[l,m] X[l,m]}}
DE & \tikz[baseline=(N.base)]\graph{D[N=red], E[N=blue]};
\end{tblr}
\end{document}
tblrtypesets its content more than once (for measurement) and that makes TikZ thinK a previus node already exists (because it does in another picture). Put\pgfpictureid\ \tikzchaincountinside your node and see id 4 and 7 for “D” and 8 for “E” instead of id 1, 1 and 2. – Qrrbrbirlbel Mar 03 '23 at 12:36