Частичные обновления прекрасно работают в ClickOnce даже при сборке в VS. Однако, если у вас есть решение, состоящее из нескольких проектов (например, нескольких проектов библиотеки классов и исполняемого файла), то каждый раз, когда вы перестраиваете все проекты, временная метка в файлах сборки будет меняться, даже если в коде этого не было. Поскольку ClickOnce действительно только смотрит на временные метки, чтобы решить, нужно ли обновлять файл, он будет извлекать (неизмененные) сборки как новые файлы, когда пользователь обновляется.
Обходной путь - извлечь любые зависимые проекты из файла решения вашего исполняемого файла и построить их отдельно. Это означает, что любые сборки, код которых не меняется очень часто, будут переданы клиенту только один раз. Если вам нужно изменить сборку, вы просто открываете ее решение и вносите изменения, затем снова открываете решение вашего исполняемого файла и перестраиваете его. При следующем обновлении ClickOnce будут загружены как исполняемый файл, так и измененная сборка.
Надеюсь, это достаточно ясно!