Index for finding combinations of attributes in JSON array
Why?
The expressed requirement that artist and title must match in the same element of the JSON array is not reflected in your query, which finds all rows where at least one element matches the artist and another (possibly a different one) matches the title.
The example data for your first case was inconclusive, since the query cannot fail this way for a single array element. Your second example demonstrates the case well, though.
Solution in Postgres 9.3
There are various ways to fix this. One way would be to translate each json array element to an SQL array of composite type consisting of artist and title and match the whole type as one.
Another way would be to keep indexes like you have now (or even a single composite spanning both expressions: (json2arr(data, 'artist'), json2arr(data, 'title')). Your current query identifies possible matches. Unnest the json array data for all identified candidates and check whether both artist and title match on the same element. May or may not be efficient enough.
Better use jsonb in n Postgres 9.4
I am not going into detail for json / pg 9.3, because the release of jsonb in Postgres 9.4 with advanced indexing capabilities mostly obsoleted the problem. This can be implemented much simpler and more efficient with a native GIN index on a jsonb column. There are various options. To optimize for the presented case:
CREATE TABLE tracks (id serial, data jsonb);
INSERT INTO tracks (id, data)  VALUES
  (1, '[{&quot;artist&quot;: &quot;Simple Plan&quot;,    &quot;title&quot;: &quot;Welcome to My Life&quot;}]')
, (2, '[{&quot;artist&quot;: &quot;Another Artist&quot;, &quot;title&quot;: &quot;Welcome to My Life&quot;},
        {&quot;artist&quot;: &quot;Simple Plan&quot;,    &quot;title&quot;: &quot;Perfect&quot;}]');

Index:
CREATE INDEX tracks_data_gin_idx ON tracks USING gin (data jsonb_path_ops);

Query:
SELECT * FROM tracks
WHERE  data @&gt; '[{&quot;artist&quot;: &quot;Simple Plan&quot;, &quot;title&quot;: &quot;Welcome to My Life&quot;}]';

Sequence of attributes in the JSON value and insignificant whitespace don't matter for jsonb. I added detailed information for jsonb to the referenced answer on SO:

Index for finding an element in a JSON array