How can this code be more "golfed"?
Splitting the string into rows of 16 and then using two nested loops to go over each pixel is taking a lot of bytes to do. It would be easier to just loop over the original string and use (index%16,index//16) to point at a specific row and column.
Also, instead of specifying a background color you can just draw every single pixel, which is shorter when using hyper-neutrino's advice to use a list of colors. You can also use #000 and #FFF instead of black and white (1 byte shorter each).
Bonus tip: (16,16) can become [16]*2 (1 byte shorter)
Combining this with knosmos huge save by using data compression and makonede's suggestion to use as imports we can get this down to 353 bytes:

import base64,zlib
from PIL import Image,ImageColor as C
i=Image.new('RGB',[16]*2)
for j in range(256):i.putpixel((j%16,j//16),C.getrgb(['#000','#000','#FFF','#FFC864','red'][int(zlib.decompress(base64.a85decode(b&quot;Garp%d1+#J#QrG=W9sOr.gFe$difq+:dD#Fi'\\kVYS/be9`DBVETlH%2Un&gt;#OH/p!dpQBq?eAD\\o?Ok%[FUW&gt;EJ8;cLZ6ZbI2XaB#r3e&quot;)).decode(&quot;u8&quot;)[j])]))
i.show()