Похоже, вы действительно не хотите использовать асинхронный код? При асинхронных вызовах невозможно узнать, сколько байтов было прочитано, пока не будет выполнен асинхронный вызов, который будет в другом потоке выполнения.
Вы можете заблокировать после вызова BeginRead и использовать некоторый мьютекс, чтобы дождаться завершения EndRead, а затем получить значение, но тогда нет смысла делать это асинхронно.