Return all rows containing specific value in json array
You could opt to use TOP(1) in the CROSS APPLY

SELECT Id
FROM Journals journals
CROSS APPLY 
(
SELECT TOP(1) Sensitive
FROM OPENJSON(journals.Data)
WITH (JournalType nvarchar(255) '$.type', Sensitive bit '$.sensitive')
WHERE Sensitive = 1
) as jsonValues;


Or, as you mentioned DISTINCT

SELECT DISTINCT Id
FROM Journals journals
CROSS APPLY OPENJSON(journals.Data)
WITH (JournalType nvarchar(255) '$.type', Sensitive bit '$.sensitive') as jsonValues
WHERE Sensitive = 1;




Main difference between the two

When using the TOP(1) the values will be filtered and the top operator will be applied earlier in the execution plan  



When using the DISTINCT solution, the filtering and grouping is only done after the JSON function is (cross) applied



Which is why I would opt for the TOP(1) + CROSS APPLY solution.



As a side note, storing unique identifiers as nvarchar() is not ideal, especially when using a huge data type like nvarchar(450). Consider using the minimal or close to the minimal amount of space needed in your column datatypes &amp; using the uniqueidentifier datatype.