Я проверил реализацию, она делает это намеренно
public void put(E e) throws InterruptedException {
if (e == null) throw new NullPointerException();
Этот сюрприз не удобен для пользователя (который хочет, например, таким образом сигнализировать об окончании потока) и нарушает общий контракт с коллекциями, которые легко принимают нулевые элементы. В чем смысл BlockingQueue различать нулевые элементы? Если нули так плохи, может быть, нам вообще следует воздержаться от их использования и применить этот минимум в JLS?