@txnelson is right, a matrix might improve the speed. Make sure you are using <<runformulas first; that might be fast enough.
dt = New Table( "Reprex",
Add Rows( 1000000 ),
New Column( "X", Numeric, Continuous, Formula( Random Integer( 0, 200 ) ) ),
New Column( "Y", Numeric, Continuous, Formula( Random Integer( 0, 200 ) ) )
);
R_debut_X = 10;
largeur = 50;
ecart_X = 5;
debut_Y = 20;
hauteur = 30;
ecart_Y = 5;
start = hptime();
// Slow way: row formula
dt << New Column( "Zone_slow", Character,
Formula(
If( R_debut_X < :X <= R_debut_X + largeur & debut_Y < :Y <= debut_Y + hauteur, "Zone 1",
R_debut_X + largeur + ecart_X < :X <= R_debut_X + 2*largeur + ecart_X & debut_Y < :Y <= debut_Y + hauteur, "Zone 2",
"Other"
)
)
);
dt<<runformulas; // <<<<<<<<<<<< important <<<<<<<<
stop=hptime();
show((stop-start)/1e6);// 1.3 sec
start = hptime();
dmatx = dt[0,{x}];
dmaty = dt[0,{y}];
cmatx1 = R_debut_X < dmatx <= R_debut_X + largeur;
cmaty1 = debut_Y < dmaty <= debut_Y + hauteur;
cmatxy1 = cmatx1 & cmaty1;
cmatx2 = R_debut_X + largeur + ecart_X < dmatx <= R_debut_X + 2*largeur + ecart_X;
cmaty2 = debut_Y < dmaty <= debut_Y + hauteur;
cmatxy2 = cmatx2 & cmaty2;
result = cmatxy1 + cmatxy2*2;
stop=hptime();
dt<<newcolumn("Zone_fast", values(result));
show((stop-start)/1e6);// .25 sec

The result value is using the 0 or 1 truth value in cmatxy1,2 to build the 0, 1, or 2 value for other, zone1, zone2. You could probably collapse some of the matrix statements to make it still faster if that is important.
Craige