This is a bit messy, there is probably a better way of doing it but this should work.
You will have to adjust the inner-most query to filter on your date range, I didn't include that bit.
I recreated your dataset and then produced the output as follows
DECLARE @t TABLE (customerId int, columnName varchar(20), newValue varchar(20), dateChanged date)
INSERT INTO @t VALUES
(1234, 'status', 'Active' , '2021-01-12' ),
(1234, 'status', 'Cancelled', '2020-09-30' ),
(1234, 'status', 'Frozen' , '2020-07-01' ),
(1234, 'status', 'Active' , '2020-01-01' ),
(5678, 'status', 'Active' , '2021-01-11' ),
(5678, 'status', 'Frozen' , '2020-11-01' ),
(5678, 'status', 'Active' , '2020-02-01' ),
(9101, 'status', 'Active' , '2021-01-10' ),
(9101, 'type', 'Full Time' , '2021-01-10' ),
(9101, 'status', 'Frozen' , '2020-10-15' ),
(9101, 'status', 'Active' , '2020-01-01' )
--SELECT * FROM @t
SELECT * FROM
(
SELECT
s.*
, LAG(newValue, 1) OVER(PARTITION BY customerId ORDER BY dateChanged) AS PreviousStatus
FROM
(SELECT *, ROW_NUMBER() OVER(PARTITION BY CustomerID ORDER BY dateChanged DESC) as RowN
FROM @t
WHERE columnName = 'Status' -- Add date filtering here
) s
WHERE s.RowN < =2
) x
WHERE newValue = 'Active' AND PreviousStatus = 'Frozen'
This gives the following output