JavaScript - 77 7575 72 bytes
f=a=>a.replace(/(.*)\[([^\[\]]*[^[]*?)\]](.)(.*)/,(a,b,c,d,e)=>f(b+c.repeat(d)+e))
Edit: updated regex with Shaggy's recommendation
Snippet:
const test = ["[Foo[Bar]3]2", "[one]1[two]2[three]3", "[three[two[one]1]2]3", "[!@#[$%^[&*(]2]2]2", "[[foo bar baz]1]1", "[only once]12", "[only twice]23456789", "[remove me!]0", "before [in ]2after"];
const f=a=>a.replace(/(.*)\[([^\[\]]*[^[]*?)\]](.)(.*)/,(a,b,c,d,e)=>f(b+c.repeat(d)+e))
d.innerHTML=test.map(f).join("<br>");
<p id="d">