Update: Using Green and Red gradient colors in the two intervals of interest
parts = Select[data, #] & /@
{#[[2]] < -1 || 6 <= #[[2]] &, -1 <= #[[2]] < 4 &, 4 <= #[[2]] < 6 &};
colorfuncs = {Automatic,
Function[{x, y}, Blend[{Lighter@Lighter@Green, Darker@Green}, y]],
Function[{x, y}, Blend[{Darker@Red, Lighter@Lighter@Red}, y]]};
Show[ListPlot[#, ColorFunction -> #2, Joined -> True, BaseStyle -> PointSize[Medium]]&@@@
Transpose[{parts, colorfuncs2}], GridLines -> {None, {-1, 4, 6}},
Frame -> True, Axes -> False] /. Line -> Point

Replace Lighter@Lighter@Green and Lighter@Lighter@Red with White in ColorFunction to get

Original answer: FWIW
You can use Style on individual data points to color each point based on its second component:
styleddata = Piecewise[{{Style[#, Lighter@Lighter@Green], #[[2]] < -1},
{Style[#, Darker@Green], -1 <= #[[2]] <= 4},
{Style[#, Darker@Red], 4 <= #[[2]] <= 6},
{Style[#, Lighter@Lighter@Red], 6 <= #[[2]]}}] & /@ data;
ListPlot[styleddata, GridLines -> {None, {-1, 4, 6}}]
