Foreign key reference to column that is no primary key
First a note about hierarchies. The technique you are currently trying to use for modules is called adjacency list. I would encourage you to look-up few other, more appropriate, SQL techniques like: path enumeration, nested sets, closure table.  

However, something seems to be wrong with this sentence:


  But the parent module always has the same values as the child modules in all 4 categories, so these columns would be redundant.


This sounds unusual at best, a hierarchy may look like:

1        region/
1.1      region/school/
1.1.1    region/school/class/
1.1.1.1  region/school/class/subject/


I will go out on a limb and claim that the problem here is not about foreign keys, but about implementing a hierarchy in SQL.

To simplify the problem, I would suggest to experiment with path enumeration for your project and explore other techniques if required.

-- Module titled TITLE is categorized as CAT_PATH.
--
module {TITLE, CAT_PATH}
    PK {TITLE}


Where CAT_PATH is one of:


region/
region/school/
region/school/class/
region/school/class/subject/


This will likely result in a different set of problems and questions, but those are going to be easier to solve.