Вы создаете теневую переменную b в качестве аргумента обратного вызова, так что это не массив, а его элемент. Поскольку вы используете цикл для рисования каждой точки отдельно, вы можете избежать использования обратного вызова для этого. Таким образом, вместо
.attr("fill", function(b) { ... })
вам нужно написать это
.attr("fill", b[i] < 6 ? "red" : "blue")
Кстати, d3 js может итерировать точки для вас:
<script>
var b = [5, 9, 6, 4, 3];
var xOffset = 100;
const height = 250;
var svg = d3.select("svg")
.selectAll('rect')
.data(b)
.enter()
.append('rect')
.attr("x", (d, i) => xOffset + 25 * i)
.attr("y", d => height - d * 20)
.attr("width", 20)
.attr("height", d => d * 20)
.attr("fill", d => d < 6 ? "red" : "blue");
</script>