Вы можете добавить дополнительный слой между текстом и фоном, где вы применяете непрозрачность:
.box {
padding:10px;
display:inline-block;
color:var(--c);
background:var(--c);
position:relative;
z-index:0;
}
.box::before {
content:"";
position:absolute;
z-index:-1;
top:0;
left:0;
right:0;
bottom:0;
background:rgba(255, 255, 255, 0.5);
}
<div class="box" style="--c:red">some text</div>
<div class="box" style="--c:blue">some text</div>
<div class="box" style="--c:green">some text</div>
Та же идея без псевдоэлемента:
.box {
padding:10px;
display:inline-block;
color:var(--c);
background:var(--c);
background-image:linear-gradient(rgba(255, 255, 255, 0.5),rgba(255, 255, 255, 0.5))!important;
}
<div class="box" style="--c:red">some text</div>
<div class="box" style="color:blue;background:blue;">some text</div>
<div class="box" style="color:green;background-color:green;">some text</div>