Если вы пишете с protobuf-net, методы WithLengthPrefix сделают это за вас. Я был бы более чем рад помочь с этим (я автор). Между прочим, причина, по которой он генерирует исключение, заключается в том, что значение varint само по себе обычно недопустимо в потоке protobuf. Система переопределит это в случае WithLengthPrefix, если вы передадите 0 в качестве номера поля (или передадите положительное число поля для более чистого потока protobuf; хотя это необязательно).
Поскольку в ProtoReader есть метод для чтения изолированного варианта (не беспокоясь о семантике потока protobuf), было бы тривиально добавить его в ProtoWriter, если это было бы полезно.
Кстати - в терминах PrefixStyle, Base128 - это то же самое, что и varint. Некоторые люди предпочитают 32-битные префиксы, чтобы вступать в брак с другими системами - следовательно, некоторые другие предоставляются.