Вам нужно либо настроить таргетинг на сам элемент, чтобы переопределить переменную
setTimeout(function() {
document.querySelector('.divwithbackground').style.setProperty('--b', 'linear-gradient(blue,blue)');
},1500);
.divwithbackground::after {
content: "";
display: block;
height: 50px;
background-image: var(--b);
}
<div class="divwithbackground" style="--b: linear-gradient(red,red);">
</div>
Или рассмотрите запасной прием, если вы хотите нацелиться на элемент root:
setTimeout(function() {
document.documentElement.style.setProperty('--b', 'linear-gradient(blue,blue)');
},1500);
.divwithbackground::after {
content: "";
display: block;
height: 50px;
background-image: var(--b,var(--c));
}
<div class="divwithbackground" style="--c: linear-gradient(red,red);">
</div>
Вы также можете установить / сбросить начальное значение так, как вы хотите:
function change() {
document.documentElement.style.setProperty('--b', 'linear-gradient(blue,blue)');
}
function reset() {
document.documentElement.style.setProperty('--b', 'initial');
}
.divwithbackground::after {
content: "";
display: block;
height: 50px;
background-image: var(--b, var(--c));
}
<div class="divwithbackground" style="--c: linear-gradient(red,red);">
</div>
<button onclick="change()">change</button>
<button onclick="reset()">reset</button>
Дополнительные вопросы / ответы для получения более подробной информации:
Как хранить наследуемое значение в пользовательском свойстве CSS (иначе CSS переменные)?
CSS пользовательские свойства (переменные) для блочной модели
CSS пользовательское свойство в области игнорируется когда используется для вычисления переменной во внешней области видимости