Postgres - Vacuum doesn't complete on large/busy table
You don't show your settings for "autovacuum_work_mem" and "maintenance_work_mem".  The default settings in 9.4 are very low (64MB, which only allows 11M tuples to be vacuumed per pass over the index), unless RDS (or you) changed them.  You need to set these to the highest value you can given the amount of RAM you have.


"index": "446 GB",
"toast": "29 MB",
"table": "37 GB"



Having the index be 12 times bigger than the table seems demented (Edit: or it would be if there was only index--I didn't think about having many indexes).  Is this a normal btree index, or is it pg_trgm or something?  Is the index corrupted somehow?  Do you know how you got into this situation?

Space in indexes is harder to reuse than space in tables. A given leaf page can only be used for new tuples if the new tuples are near the same range of values as the tuples it already holds, or if the page is completely empty.  So if the key space is alway moving in one direction (like a sequence), and almost-but-not-quite-all of the old tuples eventually get deleted, then you could be left with a bunch of pages which only hold one tuple each, and can't be reused.  Tables don't have this problem as mostly-empty pages can be used to hold any tuple that comes along.  Or, if your table was horribly bloated at some point but then got cleaned up, it is possible the table got shrunk down but the indexes did not.  (Tables can shrink if they happen to have a big chunk of completely empty pages at the end of the table).  It can be hard to tell which of these things is the one that happened.  You can use pg_freespacemap on the indexes to see how many pages are completely empty, but that probably won't be accurate until the vacuum finishes.

The fastest way out of this, although with some down time, might be to start a VACUUM FULL of the table--you don't want to spend a lot of time vacuuming a hopelessly bloated index when you could just throw it away and rebuild it in a non-bloated state. The VACUUM FULL will block, then in another session, kill the autovacuum worker (which holds a lock blocking the VACUUM FULL). You want to have the other command already waiting when you kill the autovac worker, because it will be restarted quickly and so take the lock again, unless something else is already there waiting to grab it. 


  I've tried to change a few of those for the table, but it just sits there when I try to write any values for that particular table.


Changing those table-specific settings requires a lock on the table.  The autovac worker is blocking that lock.  Normally an autovac will detect when it is blocking something else and surrender the lock, but (to prevent wraparound) does not do that.  So you would need to kill the autovac worker to be able to make this change (which is a general theme of everything here).

I wouldn't recommend changing that table-specific setting anyway. If you want this to be a one-time thing, just run a manual VACUUM or VACUUM FULL to accomplish that.  If you want it to be permanent, it is hard to justify why this one table needs a different "autovacuum_vacuum_cost_delay" than your other tables, at least based on the info given, so just change it at the system level.  If you change it at the system level, it still won't take effect in the middle of the ongoing autovac, you would need to kill it so the next one picks up the change.


  Also, would effect would a reboot of the database have on all this?


A reboot would cause the autovac to lose part of the work it has already done, and start over again.  It wouldn't accomplish anything, unless you also made meaningful configuration changes which will take effect after the reboot.