JSFiddle - React, Tailwind, and code Playground

JavaScript

log=s=>{document.body.innerHTML+=`${s}<br>`}

function Prop(obj,is,value) {
    if (typeof is == 'string')
        is=is.split('.');
    if (is.length==1 && value!==undefined)
        return obj[is[0]] = value;
    else if (is.length==0){
        return obj;
    }else{
        var prop=is.shift();
        //Forge a path of nested objects if there is a value to set
        if(value!==undefined&&obj[prop]==undefined)obj[prop]={}
        return Prop(obj[prop],is, value);
    }
}

function render(str,obj){
		originalRegex = /\$\{(.+?)\}/g
    RelicRegex = /(?!\${)([^{}]*)(?=})/g
    return str.replace(originalRegex,(match,p1)=>Prop(obj,p1))
}

log(render('abc${a}asdas',{a:23,b:44})) //abc23asdas
log(render('abc${a.c}asdas',{a:{c:22,d:55},b:44})) //abc22asdas