Using Miller (mlr):
sed 's/;/\t/' file | mlr --nidx --fs tab nest --evar ';' -f 4
This first uses sed to replace the first ; on each line with a tab, separating the third tab-delimited field into two separate fields. GNU sed can insert a tab character using \t with the s command, but not all sed implementations may. If your's can't, then type a literal tab character in place of \t by pressing Ctrl+V+Tab.
Miller then reads and writes tab-delimited data (--nidx --fs tab) and will "explode" (or "un-nest") each record based on the ;-delimited sub-fields of the fourth tab-delimited field (nest --evar ';' -f 4).
The output, given the data in the question:
cg13201342 F ARNT ARNT
cg13201342 F ARNT ARNT
cg13201342 F ARNT CTSK 3'UTR
cg13201342 F ARNT 3'UTR
cg13201342 F ARNT 3'UTR
cg13201342 F ARNT TSS1500
cg05269359 F SCN4B SCN4B
cg05269359 F SCN4B SCN4B
cg05269359 F SCN4B SCN4B 3'UTR
cg05269359 F SCN4B 3'UTR
cg05269359 F SCN4B 3'UTR
cg05269359 F SCN4B Body
cg06018296 R NEK3 NEK3
cg06018296 R NEK3 NEK3
cg06018296 R NEK3 NEK3 3'UTR
cg06018296 R NEK3 3'UTR
cg06018296 R NEK3 3'UTR
cg06018296 R NEK3 Body
cg05172994 F WDR20 WDR20
cg05172994 F WDR20 WDR20
cg05172994 F WDR20 WDR20 3'UTR
cg05172994 F WDR20 3'UTR
cg05172994 F WDR20 3'UTR
cg05172994 F WDR20 Body
Passing this through uniq would remove duplications of adjacent lines.
Using only awk:
awk -F '\t' 'BEGIN { OFS=FS }
{
nf = split($3,a,";")
for (i = 2; i <= nf; ++i) print $1, $2, a[1], a[i]
}' file
This splits the third field on ; and then, for the second sub-field on of the third field, proceeds to output the first two fields together with the first sub-field of the original third field.
The output of this is identical to that of the pipeline at the top of this answer.
;*matches on zero or more;s so" *;*"also matches one the empty string. Maybe you meant" *; *"instead.