Find rows without matching second field for given constants in first field
I believe that you want the following (see fiddle here):
Create and populate table - using SQL Server 2012 as this will most closely emulate Access. I've used my own SQL style largely modelled on this.
CREATE TABLE source_table
(
  first_name VARCHAR (5) NOT NULL, 
  last_name  VARCHAR (7) NOT NULL,
  CONSTRAINT f_l_uq UNIQUE (first_name, last_name)
);

and
INSERT INTO source_table
  (first_name, last_name)
VALUES
  ('Jane', 'Smith'),
  ('John', 'Smith'),
  ('Blake', 'Smith'),
  ('Jane', 'Johnson'),
  ('Blake', 'Johnson');

I've put a UNIQUE constraint on the combination of (first_name, last_name) because it makes sense - if this really is your entire table, you could make it the PRIMARY KEY - if there is/are (a) PK field(s) as part of a table with more fields, then just add this constraint.
If you do have duplicate first and last names combined (dupes), then you can just add a DISTINCT clause to your SELECT and this will give you unique values for your desired result(s) - included in the fiddle, not shown here.
then run the following SQL:
SELECT -- DISTINCT if there are dupes!
  s1.first_name,
  s1.last_name
FROM source_table s1
WHERE s1.last_name = 'Smith'
AND s1.first_name NOT IN
(
  SELECT first_name FROM source_table s2
  WHERE last_name != 'Smith'
);

Result:
first_name  last_name
      John      Smith

Et voilà - the desired result!
p.s. db&lt;&gt;fiddle is a better tool that SQLFiddle - more servers (see dropdown) and more functionality (see the compare link) for example!
p.p.s. welcome to the forum!