You are looking for partial evaluation. Perhaps, there is a shorter way, but here is one (rather subtle):
Clear[evalAtPattern]
$evalAtPattern[expr_evalAtPattern[expr_, p_] :=
expr /. pt : p :> With[{pp = pt}, pp /; True];
Clear[formula];
formula[x_List] :=
evalAtPattern[
Defer[(x[[1]] - x[[2]]) + (x[[3]] - x[[4]])],
HoldPattern[x[[_]]]];
Now,
formula[{1, 2, 3, 4}]
(* (1 - 2) + (3 - 4) *)
And the output code can be executed. The solution combined injecting evaluated pieces inside held expressions via Trott - Strzebonski technique, and the use of Defer
.