Метод Read вызывается, когда звуковая карта нуждается в большем количестве данных для воспроизведения. Блокировка обычно не является хорошим вариантом, потому что вы можете находиться в потоке внутри самого драйвера (как в ASIO или WaveOut с обратными вызовами функций), или вы можете быть в потоке GUI (как в WaveOut с обратными вызовами сообщений Windows).
Возвращение 0 из метода Read означает «это конец аудиоданных», поэтому возвращение 0 приведет к остановке воспроизведения.
Таким образом, третий вариант - лучший выбор, чтобы не блокировать потоки, на которые вы не должны блокировать, и разрешить продолжить воспроизведение.
Если бы потребителем вашего метода Read был, например, WaveFileWriter, вариант 1 подойдет (и вариант 2 может зависеть от того, как вы определяете, когда прекратить запись в файл WAV).