I personally find it easier to think of

#color(white)("XXX")(f * g)(x)# and #(f * g)(-1)#

as #f(g(x))# and #f(g(-1)# respectively

Given

#color(white)("XXX")f(color(blue)x)=color(blue)x^2-1#

then

after simply substituting #color(blue)(g(x))# for #x#

#color(white)("XXX")f(color(blue)(g(x)))=(color(blue)(g(x)))^2-1#

Now since we are also given that

#color(white)("XXX")color(blue)(g(color(magenta)x)=2color(magenta)x-3#

after substituting #color(blue)(2color(magenta)x-3)# for #color(blue)(g(x))# above

we get

#color(white)("XXX")f(color(blue)(g(color(magenta)x)))=(color(blue)(2color(magenta)x-3))^2-1#

Expanding (and dropping the color coding for a bit)

#color(white)("XXX")f(g(x))=4x^2-12x+8#

...or we could re-color code the variable #color(red)x# to make this appear as

#color(white)("XXX")f(g(color(red)(x)))=4color(red)x^2-12color(red)x+8#

Since we are asked for #(f * g)(color(red)(-1))#

which can be written as #f(g(color(red)(-1)))#

we can substitute #(color(red)(-1))# in place of #color(red)x# in our definition of #f(g(color(red)x))#

#color(white)("XXX")f(g(color(red)(-1)))=4 * (color(red)(-1))^2-12 * (color(red)(-1))+8#

#color(white)("XXXXXXXX")=4+12+8#

#color(white)("XXXXXXXX")=24#