A problem with security logs is that some of the text is probably under user control, so using regular expressions to break things apart is problematic. However you can potentially use more than one expression to break things apart, and this can work around the limit of 9 backreferences. For example if all your log entries start with a timestamp you can peel that off.
awk '{t=$1 ;$1="";
print gensub(/^.+?\sID\s(\[[0-9]{4}\]).+?\sTargetUserName\s=\s(.+?)\sTargetDomainName\s=\s(.+?)\sTargetLogonId\s=\s(.+?)\sLogonType\s=\s([0-9]{1,2})\s(.+?\sWorkstationName\s=\s(.+?)\sLogonGuid\s=\s.+?TransmittedServices\s=\s.+?\sLmPackageName\s=\s.+?KeyLength\s=\s.+?\sProcessId\s=\s.+?\sProcessName\s=\s.+?\sIpAddress\s=\s(.+?)\sIpPort\s\=\s([0-9]{1,}))?.+?$/,"\\4,\\3,\\2,\\1\\5" t ",\\7,\\8,","g") }'
You can be selective, so you have WorkstationName\s=\s(.+?)\sLogonGuid as part of you pattern, you could use
awk {t=$1; $1="" ; printf("%s", gensub(/^.+?WorkstationName\s=\s(.+?)\sLogonGuid.*$/,"\\1,")); printf("%s,", t)}
to pull out a field, and this can be repeated.
@cas notes in the comments that the data can be viewed in 2 parts, the stuff before the EventData/Data -> and the stuff after it, and that the stuff after it can be split on = (space equal space). I would go further and view it as key/value pairs and split on /\s\S+\s=\s/ and use optional 4th argument to split to get the keys. There are a couple of big assumptions in this, that the user doesn't get to put an equals sign into the line and that each piece of data has a single word key. Note the index of the keys and values differ by 1, and that the initial part of the line ends up in v[1].
/usr/bin/awk '{
n=split($0,v,/\s\S+\s=\s/,k)
printf("There are %d fields\n",n)
for(i=0;i<n;i++) { printf("%d key \"%s\" value \"%s\"\n",i,k[i],v[i+1]) }
}'
with your sample data gives
There are 22 fields
0 key "" value "2017-03-21T02:00:00 kornawesome Security/Microsoft-Windows-Security-Auditing ID [4624] :EventData/Data ->"
1 key " SubjectUserSid = " value "S-1-5-18"
2 key " SubjectUserName = " value "PRETENDERS$"
3 key " SubjectDomainName = " value "WORKGROUP"
4 key " SubjectLogonId = " value "0x00000000000004j7"
5 key " TargetUserSid = " value "X-12-54-181"
6 key " TargetUserName = " value "SYSTEMS"
7 key " TargetDomainName = " value "NT AUTHORITY"
8 key " TargetLogonId = " value "0x00000000000003e7"
9 key " LogonType = " value "8"
10 key " LogonProcessName = " value "Lxxoi "
11 key " AuthenticationPackageName = " value "Negotiate"
12 key " WorkstationName = " value "-"
13 key " LogonGuid = " value "{00344000-0000-0000-0000-0000000003440}"
14 key " TransmittedServices = " value "-"
15 key " LmPackageName = " value "Stainless"
16 key " KeyLength = " value "0"
17 key " ProcessId = " value "0x0000000000000244"
18 key " ProcessName = " value "C:/Windows/System32/services.exe"
19 key " IpAddress = " value "10.0.0.0"
20 key " IpPort = " value "10.5.3.2"
21 key " ImpersonationLevel = " value "%%1122"
From here you can go further, create an associative array called say data
for(i=1;i<n;i++) {gsub(/[ =]/,"",k[i]);data[k[i]]=v[i+1]}
and then you can print out things like data["IpPort"] rather than worrying if this is field 20 or 21.