There is no built-in UTC conversion, so you'll have to roll your own.
There are a couple of ways of doing it. It sounds like you've already played with parsing the UTC string into components, so it's mostly a matter of adding them up.
Even then there are a few approaches to consider. You might break the components into separate cells for clarity. I opted for using LET() to break out the components. Here's the formula I used (with cell C10 as the cell containing a UTC string):

LET(dateStr,TEXTBEFORE(C10,"T"),
timeStr,TEXTAFTER(C10,"T"),
_time,TEXTBEFORE(timeStr,REGEX("[+-]")),
_tz,TEXTAFTER(timeStr,REGEX("[+-]"))
plusneg,FIND("+",timeStr,1),
DATEVALUE(dateStr)+
TIMEVALUE(_time)+
TIMEVALUE(_tz)×IF(ISNUMBER(plusneg),1,−1)
)
It probably needs some explaining :)
First, if you're not familiar with LET(), it lets you assign variable names to sub-formulas. In this case, I create 4 variables, namely:
dateStr ,TEXTBEFORE(C10,"T")
This parses cell C10 and extracts the first element up to the T character. This is now referred to as dateStr
timeStr,TEXTAFTER(C10,"T"),
This does a similar thing, except it takes everything after the T and calls it timeStr
The timeStr needs some extra processing, though, to extract the timezone offset;
_time,TEXTBEFORE(timeStr,REGEX("[+-]")),
This takes the aforementioned timeStr and captures all the text up to the + or - sign (the offset could be positive or negative), and calls this _time.
Similarly,
_tz,TEXTAFTER(timeStr,REGEX("[+-]")),
does a similar regular expression match and captures everything after the +/-, and calls this _tz.
Finally, we run a quick FIND() to see if there's a positive offset in the time zone:
plusneg,FIND("+",timeStr,1),
Now we have the UTC string broken into components we can easily work with, dateStr, _time, and _tz. We can simply add them together:
DATEVALUE(dateStr)+
TIMEVALUE(_time)+
TIMEVALUE(_tz)×IF(ISNUMBER(plusneg),1,−1)
Note that we convert the dateStr to a valid DATE value, then add the _time component. Last thing to go is add or subtract the timezone offset, which is done by multiplying the _tz value by either 1 or -1, depending on whether there's a positive or negative offset.
So it looks like a lot, but hopefully it makes sense.