РЕДАКТИРОВАТЬ Вычеркните мой первоначальный ответ, я неправильно понял проблему.
Причиной, по которой это не компилируется, является проблема вывода типа и позднего связывания. В первом примере поле является локальной переменной и, следовательно, может участвовать в выводе типа. Компилятор правильно выведет тип как FieldInfo. Это означает, что вызов SetValue является типизированным вызовом. Это пустой метод возврата и, следовательно, несовместимый с лямбда-выражением Function, для которого требуется возвращаемое значение.
Значение поля во втором примере объявлено на уровне модуля. Эти переменные не подлежат выводу типа и, следовательно, объект типа будет выбран. Поскольку тип является объектом, вызов SetValue становится поздним связанным вызовом. Предполагается, что все поздние связанные вызовы указывают на функцию, которая имеет тип возвращаемого значения Object. Во время выполнения, если функция возвращает void, фактически ничего не будет возвращено. Так что в этом контексте это не пустое возвращаемое выражение и, следовательно, компилируется.
Один из вариантов, который вам нужно обойти, - это явно ввести поле как Object в первом примере. Это приведет к тому, что это будет вызов с поздней привязкой, и он скомпилируется так же, как и второй
Dim field As Object = ...