How should I store a group of constant data of the same type?

If an int is 16 bits and a bool is 1 bit, how does it save memory to use an int array?

In the first place a boolean is not 1 bit it is 8 bits

So

const bool COM[12] = {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1};
const bool OUT1[8] = {0, 1, 0, 1, 0, 0, 1, 1};
const bool OUT2[8] = {0, 1, 0, 1, 1, 1, 0, 0};
const bool OUT3[8] = {0, 1, 1, 1, 0, 0, 0, 0};
const bool OUT4[8] = {1, 1, 0, 1, 0, 0, 0, 0};
const bool ON[5] = {0, 0, 1, 1, 0};                // I've added the last 0 bit because why store it separate
const bool OFF[5] = {1, 1, 0, 0, 0};

uses 54 bytes

Whereas

const int theData[7];

uses 14 bytes

You do not need a 2 dim array
To access say the first bit of the third level you could use

boolean theBool = bitRead(theData[2, 0]);

CORRECTION : See post #6 for a correction to this line of code

You could also get the boolean value by bit masking if you are comfortable with that and you can, of course, iterate through the bits of an array level if you want/need to retrieve a set of values.

To take the idea further you could use C bitfields and structs. Plenty of examples online