In any case, here is some example code below that corrects the issue. It's far from elegant and due to the heavy use of array concatenation, it could be very slow for "large" datasets. It runs fine in my test up to 1000 points. Maybe someone can improve it.
ireset,/no
npts = 30
;Example data #1 (random)
x = findgen(npts)
y = randomn(seed,npts)
;Example data #2 (sine wave)
;x = findgen(npts)
;y = sin(x*20*!PI/180)
;Calculate the position of all the locations where the line crosses the X-axis and create new plot data for drawing the polys
xNew = !null
yPos = !null
yNeg= !null
for i=0,n_elements(x)-1 do begin
if i ne n_elements(x)-1 then begin
slope = (y[i+1]-y[i])/(x[i+1]-x[i])
if (y[i] gt 0 and y[i+1] lt 0) then begin
xNew=[xNew,x[i],(-y[i]/slope)+x[i]]
yPos = [yPos,y[i],0]
yNeg = [yNeg,0,0]
endif else if (y[i] lt 0 and y[i+1] gt 0) then begin
xNew=[xNew,x[i],(-y[i]/slope)+x[i]]
yPos = [yPos,0,0]
yNeg = [yNeg,y[i],0]
endif else begin
xNew = [xNew,x[i]]
if y[i] gt 0 then yPos = [yPos,y[i]] else yPos = [yPos,0]
if y[i] gt 0 then yNeg = [yNeg,0] else yNeg=[yNeg,y[i]]
endelse
endif else begin
xNew = [xNew,x[i],x[i]]
yPos = [yPos,y[i],0]
yNeg = [yNeg,y[i],0]
endelse
endfor
;Plot positive values first and fill red
plot1 = plot([xNew,reverse(xNew)],[yPos,intarr(n_elements(xNew))],ytitle='Normalized Anomaly',thick=3,$
font_size=15,yrange=[min(yNeg)-abs(min(yNeg))*.05,max(yPos)*1.05],linestyle=6,/FILL_BACKGROUND,FILL_COLOR='red',dimensions=[1700,800])
;Plot negative values second and fill blue
po1 = polygon([xNew,reverse(xNew)],[yNeg,intarr(n_elements(xNew))],/FILL_BACKGROUND,FILL_COLOR='blue',/DATA,target=plot1)
;Finish the plot with a solid black line and dots
finish = plot(x,y,thick=2,symbol='o',/SYM_FILLED,/overplot)