Working atop nitro2k01's great suggestion that some of the DAC's input pins are stuck high or low, I tried simulating this in MATLAB. Forcing certain bits on or off didn't quit produce the right output (in particular, the signal would show frequent excursion to fullscale high and low, which you don't see here). But, long story short, if you simulate that the DAC has failed in such a way that it just sums all the input bits and just outputs that sum (outputting b1 + b2 + b3... instead of 1 * b1 + 2 * b2 + 4 * b3...), you get a very familiar looking graph (attached).
This doesn't feel like good news for the state of health of the DAC, although it is circumstantial evidence at best.
Source:
% Random tweaking value
dacbits = 13;
% Ideal sine wave
y=sin(0:0.0003:2*pi);
% Values to DAC
vals= repmat(uint16(y*(2^(dacbits-1)-1)+(2^(dacbits-1))), 16, 1);
% Convert into individual bits (from LSB to MSB)
bits = 0 ~= bitand(vals, repmat(uint16(2.^((0:15)')), 1, numel(y)));
% Simply sum all the bits, instead of do a sum weighted by 1 (LSB) ... 2^N
% (MSB)
plot(sum(bits))
As a side question, I'm wondering if this idea makes any sense: I'd go around and test the voltage across the op-amp inputs (input- vs input+). According to the whole virtual earth principle thing, they should be equal (unless the output is saturated). If you found just one or two op-amps that failed VEP, maybe it would be worth a shot at socketing+replacing those. This obviously requires you to be able to probe the live board, though.