Intuition is sometimes tricky on fitting procedures. This is of course not a Mathematica issue, but a problem of fitting in general.
You can see the problem in parameter space (hence it depends on the details of parameter space).
Defining for the residuals (square root)
Res1[ff_, aa_, bb_] := Norm[data[[All, 2]] - (m1 /. {f -> ff, a -> aa, b -> bb, t -> #} & /@data[[All, 1]])]
and plotting
GraphicsGrid[{{
Plot3D[Res1[100.1, aa, bb], {aa,-50,50}, {bb,-50,50}, MeshFunctions -> {#3 &}],
Plot3D[Res1[100., aa, bb], {aa,-50,50}, {bb,-50,50}, MeshFunctions -> {#3 &}],
Plot3D[Res1[99.9, aa, bb], {aa,-50,50}, {bb,-50,50}, MeshFunctions -> {#3 &}]
}}]

you see that the gradient in the $(a,b)$ projection of the parameter space complete changes direction upon small changes in frequency.
On the other hand with
Res2[ff_, aa_, ϕϕ_] := Norm[data[[All,2]] - (m2 /. {f -> ff, a -> aa, ϕ -> ϕϕ, t -> #} & /@ data[[All, 1]])]
and plotting
GraphicsGrid[{{
Plot3D[Res2[100.1, aa, fi], {aa,-50,50}, {fi,-Pi,Pi}, MeshFunctions -> {#3 &}],
Plot3D[Res2[100.0, aa, fi], {aa,-50,50}, {fi,-Pi,Pi}, MeshFunctions -> {#3 &}],
Plot3D[Res2[99.9, aa, fi], {aa,-50,50}, {fi,-Pi,Pi}, MeshFunctions -> {#3 &}]
}}]

is more 1 dimensional. So you are not running in circles. While not a complete answer, I hope this gives an idea.
A note at the end. My general advice is: whenever possible redefine your model such that all parameters are on the same order of magnitude.
First Update
Concerning op's concern: The plots for model 1 look nice and quadratic (as I suggested in the second part of my question). The plots for model 2 are wild and could easily take you off in the wrong direction.
I agree, but this is only in a 2D cut of the 3D problem. Moreover, phi is restricted to mod $2 \pi$ Sure, there are saddle points and they actually take you off, resulting in the large phase in the end, while $431 \mod 2\pi$ makes $3.9$ a good guess. Furthermore, if you jump in the next minimum of the phase and make a phase shift of $\pi$, the cut in amplitude is parabolic, giving you very fast the amplitude with opposite sign.
In detail you can see what I mean If you look how Mathematica travels through your parameter space (at the moment I only have Version 6 at hand)
{fit3, steps3} =
Reap[FindFit[data, m1, {{f, 100}, {a, 8}, {b, 41}}, t,
MaxIterations -> 1000, StepMonitor :> Sow[{f, a, b}]]];
Show[Graphics3D[
Table[{Hue[.66 (i - 1)/(Length[First@steps3] - 1)],
AbsolutePointSize[7], Point[(First@steps3)[[i]]],
Line[Take[First@steps3, {i, i + 1}]]}, {i, 1,
Length[First@steps3] - 1}], Boxed -> True, Axes -> True],
BoxRatios -> {1, 1, 1}, AxesLabel -> {"f", "a", "b"}]

Here you see what I mean with going in circles. Even after $1000$ Iterations you are not even close as the $(a,b)$-minimum changes position with changes in frequency in such an unfortunate way.
If you look on the other hand at the second model you get:
{fit2, steps2} =
Reap[FindFit[data, m2, {{f, 100}, {a, 40}, {ϕ, 3.9}}, t,
StepMonitor :> Sow[{f, a, ϕ}]]];
Show[Graphics3D[
Table[{Hue[.66 (i - 1)/(Length[First@steps2] - 1)],
AbsolutePointSize[7], Point[(First@steps2)[[i]]],
Line[Take[First@steps2, {i, i + 1}]]}, {i, 1,
Length[First@steps2] - 1}], Boxed -> True, Axes -> True],
BoxRatios -> {1, 1, 1}, AxesLabel -> {"f", "a", "ϕ"}]

where it finds the amplitude quite fast, reducing the problem to 2D in phase and frequency.
Second Update
Concernings the op's question if the final result is a quadratic well.
Let us just plot the three cuts in parameter space.
{faPlot = ContourPlot[Res2[freq, amp, 434.3256],
{freq, 94.9197 - .01, 94.9197 + .01}, {amp,-43.4566-10, -43.4566 +10}],
fpPlot = ContourPlot[Res2[freq, -43.4566, phase],
{freq, 94.9197-.01,94.9197 + .01}, {phase, 434.3256-1.5,434.3256+1.5}],
apPlot = ContourPlot[Res2[94.9197, amp,phase],
{amp, -43.4566-15, -43.4566+15}, {phase,434.3256-1.5,434.3256+1.5}]}

This looks promising except for the middle graph. After a coordinate transformation, however, we get
β = 84.57;
ContourPlot[Res2[94.9197 + fff + ppp/β, -43.4566, 434.3256 - β fff + ppp],
{fff, -8.5, +8.5}, {ppp, -1.5, +1.5}]
which gives

So this looks OK as well. All is good.
Making the troublesome fit work
On StackOverflow I came across answers from Jean Jaquelin providing methods to turn non-linear fits in actual linear fits. Some information can be found here.
The point is that when looking at $y = a \cos( \omega t) + b \sin(\omega t)$ we know that the second derivative is $y'' = - \omega^2 y$. Numerical derivatives are very often critical though. Slightly better is to look at the double integration $\int\int y = -y/\omega^2 + c t + d$. The Integration can be performed rather easy with
cumint[ indata_ ] := Module[
{
p = Interpolation[indata] ,
timedata,
signaldata,
int
},
timedata = indata[[All, 1]];
signaldata = indata[[All, 2]];
int = Join[{0}, Table[
NIntegrate[ p[t], {t, timedata[[i]], timedata[[i + 1]]} ],
{i, 1, Length[ timedata ] - 1 } ]
];
Return[ Transpose[{ timedata, Accumulate[int] } ] ]
]
(This is my quick and dirty solution while in python using cumtrapz
) This leaves us with a linear optimization for $1/\omega^2$, $c$ and $d$, while we are only interested in the first one. We then have
dT = Transpose[data];
tList = dT[[1]];
sList = dT[[2]];
y1 = cumint[data];
y2 = cumint[y1];
SSList = y2[[All, 2]];
GraphicsArray[{{ListPlot[ data, Joined -> True],
ListPlot[ y1, Joined -> True], ListPlot[ y2, Joined -> True]}}]

VT = {sList, tList, Table[1, Length[data]]};
V = Transpose[ VT ];
A = VT.V;
SV = VT.SSList;
AI = Inverse[ A ];
\[Alpha] = AI.SV;
w0 = Sqrt[-1/\[Alpha][[1]]];
f0 = w0/2/Pi
which gives f0 = 94.9134
. With this knowledge one can make a linear fit on a
and b
, namely
sv = Sin[ w0 tList];
cv = Cos[w0 tList];
WT = {cv, sv};
W = Transpose[WT];
B = WT.W;
BI = Inverse[B];
SY = WT.sList;
sol = BI.SY
providing {-10.9575, 42.0522}
, and
ListPlot[
{
sList, (sol[[1]] cv + sol[[2]] sv)
}, Frame -> True, Joined -> {False, True}
]

This looks already very good. Now let's try to use this results as start parameters for the non-linear fit.
{fit3, steps3} =
Reap[FindFit[data, m1, {{f, f0}, {a, sol[[1]]}, {b, sol[[2]]}}, t,
MaxIterations -> 1000, StepMonitor :> Sow[{f, a, b}]]];
Show[Graphics3D[
Table[{Hue[.66 (i - 1)/(Length[First@steps3] - 1)],
AbsolutePointSize[7], Point[(First@steps3)[[i]]],
Line[Take[First@steps3, {i, i + 1}]]}, {i, 1,
Length[First@steps3] - 1}], Boxed -> True, Axes -> True],
BoxRatios -> {1, 1, 1}, AxesLabel -> {"f", "a", "b"}]
fit3
{f -> 94.9197, a -> -30.7143, b -> 30.7426}
Now it works. The slight modification in the frequency, however, resulted again in a quite dramatic change of amplitudes. Does it really fit? How does it look?
ListPlot[
{
data,
Table[{t, a Cos[ 2 Pi f t] + b Sin[2 Pi f t]}, {t, data[[1, 1]],
data[[-1, 1]], 0.0001}] /. fit3
}, Joined -> {False, True}
]

It does fit and looks good. In this simple case the pure linear approach probably would have been enough. In case of noisy data it still might work, but definitively gives a good set of starting values. One also can use this results to calculate better starting values for the solution using phases. In the presented example it is not necessary, but might be of interest in case of noisy data.
MaxIterations -> 1000
as an option toNonlinearModelFit
. Doing so generated the following best fit parameters for me:{f -> 94.9197, a -> -30.7143, b -> 30.7426}
, with errors on the parameters:{0.00207457, 5.39375, 5.38866}
. This seems in good agreement at least with the frequency you found. $\endgroup$fit1["CorrelationMatrix"] // MatrixForm
results in $\left( \begin{array}{ccc} 1. & -0.999999 & -0.999999 \\ -0.999999 & 1. & 0.999999 \\ -0.999999 & 0.999999 & 1. \\ \end{array} \right)$. $\endgroup$