Use a lookahead:
$split_references = preg_split("/((, | or | and ))(?=[^0-9(])/i", $reference);
This says "not followed by one of these characters" without "consuming" those characters. Alternative (identical - but negative lookahead rather than positive lookahead on negative character class):
$split_references = preg_split("/((, | or | and ))(?!=[0-9(])/i", $reference);
Result of the above:
Array
(
[0] => Genesis 1:1-2:4a
[1] => Psalm 136:1-9, 23-26
[2] => Genesis 7:1-5, 11-18; 8:6-18; 9:8-13
[3] => Psalm 46
[4] => Genesis 22:1-18
[5] => Psalm 16
[6] => Exodus 14:10-31; 15:20-21
[7] => Exodus 15:1b-13, 17-18
[8] => Isaiah 55:1-11
[9] => Isaiah 12:2-6
[10] => Baruch 3:9-15, 3:32-4:4
[11] => Proverbs 8:1-8, 19-21; 9:4b-6
[12] => Psalm 19
[13] => Ezekiel 36:24-28
[14] => Psalm 42, 43
[15] => Ezekiel 37:1-14
[16] => Psalm 143
[17] => Zephaniah 3:14-20
[18] => Psalm 98Genesis 1:1-2:4a
[19] => Psalm 136:1-9, 23-26
[20] => Genesis 7:1-5, 11-18; 8:6-18; 9:8-13
[21] => Psalm 46
[22] => Genesis 22:1-18
[23] => Psalm 16
[24] => Exodus 14:10-31; 15:20-21
[25] => Exodus 15:1b-13, 17-18
[26] => Isaiah 55:1-11
[27] => Isaiah 12:2-6
[28] => Baruch 3:9-15, 3:32-4:4
[29] => Proverbs 8:1-8, 19-21; 9:4b-6
[30] => Psalm 19
[31] => Ezekiel 36:24-28
[32] => Psalm 42, 43
[33] => Ezekiel 37:1-14
[34] => Psalm 143
[35] => Zephaniah 3:14-20
[36] => Psalm 98
)