May the wind be always at your back
Python 3.8 (pre-release), 176 bytes

lambda w,h,b:b.find('i')in(r:={b.find('c')})|{r.update(*([{(d:={'&lt;':i-1,'&gt;':i+1,'^':i+~w,'v':i-~w}).get(b[i],i)},{*d.values()}][b[i]in'*c']for i in r if-1&lt;i&lt;len(b)))for _ in b}

Try it online!
Ungolfed
def f(w,h,b):
  r = {b.find('c')}
  for _ in b:
    for i in list(r):
      if 0 &lt;= i &lt; len(b):
        d = {'&lt;':i-1,'&gt;':i+1,'^':i-w-1,'v':i+w+1}
        if b[i] in '*c':
          r.update(d.values())
        r.add(d.get(b[i],i))
  return b.find('i') in r