Based on this old question of mine, I wrote a function for this task in general, called Reinterpolate
:
Reinterpolation::usage="Reinterpolation[f] reinterpolates a function containing one or more InterpolatingFunctions.";
Reinterpolation[f_,opts___?OptionQ]:=Module[{
(* options *)
interpolationopts,interpolationpoints,
(* other variables *)
xmin,xmax,ifs,grid,tmp},
(* handle options *)
interpolationopts=FilterRules[Flatten[{opts,Options[Reinterpolation]}],Options[Interpolation]];
interpolationpoints=Evaluate[InterpolationPoints/.Flatten[{opts,Options[Reinterpolation]}]];
ifs=Cases[f,_InterpolatingFunction,{0,\[Infinity]}];
If[ifs=={},Return[f]];
If[interpolationpoints===Automatic,
grid=Union[Flatten[Through[ifs["Grid"]],1]],
{xmin,xmax}=ifs[[1,1,1]];
grid=Table[x,{x,xmin,xmax,(xmax-xmin)/(interpolationpoints-1)}];
];
Quiet[
tmp=Interpolation[Table[{Sequence@@val,f/.(if_InterpolatingFunction->if[Sequence@@val])},{val,grid}],Evaluate[Sequence@@interpolationopts]]
,{InterpolatingFunction::dmval}];
tmp[[1]]=ifs[[1,1]]; (* fix domain *)
Return[tmp]
];
Options[Reinterpolation]={InterpolationPoints->Automatic};
It works applied to your problem:
{f1, f2} =
Block[{dat1, dat2}, dat1 = ListInterpolation[{1, 2, 3, 4}];
dat2 = Reinterpolation[-dat1];
{dat1, dat2}];
{f1[1], f2[1]}
Plot[{f1[t], f2[t]}, {t, 1, 4}]
(* {1, -1} *)

I'd of course be interested in any improvements folks could suggest.
Addition 1:
OP @JohnBechhoefer asked whether this function could be modified to allow the explicit use of the independent variable. This seems to work already:
f1 = ListInterpolation[{1, 2, 3, 4}];
f2 = Reinterpolation[Piecewise[{{f1, t < 2.5}, {-f1, t >= 2.5}}]];
Plot[{f1[t], f2[t]}, {t, 1, 4}]

This was surprising, because I didn't try to build that functionality in. To see what's going on, we can look inside f2
:
f2["ValuesOnGrid"]

An unintended happy side-effect! Is this sufficient for you? Otherwise it might be able to be calculated for each point in the new InterpolatingFunction
if you have an example where this fails.
dat2 = - dat1[#] &
? $\endgroup$dat2 = Evaluate[- dat1[#]] &
. $\endgroup$