I got the chunks apart... So I guess it's a place to start. You need Jeff's string splitter function for this, which is here. And here's my code... You would do this against a table with a select query, but you didn't give me a table, so I cheated some.
DECLARE @ChangeString VARCHAR(100) = '|LastName:Smith|Jones|FirstName:Bill|William';
SET @ChangeString = RIGHT(@ChangeString,LEN(@ChangeString)-1);
SELECT x.ItemNumber
, x.Item
FROM Scratchpad.dbo.DelimitedSplit8K(@ChangeString, '|') x;
INSERT INTO #TempNames(ItemNumber, Item)
(SELECT x.ItemNumber
, x.Item
FROM Scratchpad.dbo.DelimitedSplit8K(@ChangeString,'|') x );
SELECT RecID
, ItemNumber
, Item
, RIGHT(Item,LEN(Item) - CHARINDEX(':', Item)) AS NamePart
, CASE WHEN ItemNumber%2=1 THEN 'Old Value' ELSE 'New Value' END WhichVal
FROM #TempNames;