If you're open to using SPI, multiple chains of SPI devices can do this, with a more straightforward driver than I2C. As a bonus, SPI will offer you faster updates than you can achieve with I2C. If your host can do multi-bit SPI, even better.
Adafruit themselves have a 12-channel, 16-bit PWM board for $7.50 which is a bit more affordable than the PCA9685 version.
A possibly even cheaper approach, but with more intense CPU overhead, is to implement the PWM directly with shift registers with something like the 74HC595. With this approach the SPI runs all the time, and you implement PWM by controlling the duty cycle in software. Since SPI uses a fixed frequency clock the PWM timing is deterministic.
More here: https://hackaday.com/2011/11/05/controlling-shift-registers-via-spi/
And here: https://forum.arduino.cc/t/software-pwm-using-daisy-chained-74hc595s-spi/38251
TI offers a shift-register style LED driver with built-in current references, saving you the trouble of individual LED resistors. If you only need one color (or use separate R,G,B drivers) then is is a good option: https://www.ti.com/product/TLC59284