Perform mysql limited select that wraps when it reaches the end of table
I've set a rextester example whith this sample data:

drop table if exists promotions;
create table if not exists promotions (promo_id int, expiry_date timestamp);
insert into promotions values
(1, '20170101'),(2, '20170101'),(3, '20170101'),(4, '20170101'),(5, '20170101');


IMHO you should add two additional records and then limit final result to two rows. Use a UNION with your query and an addition query that simply returns the two first rows of promotions table.

Note: Add parentheses to both queries or you'll get an error.

(select  promo_id
from     promotions
where    promo_id &gt; 4
order by promo_id
limit    2)
union
(select  promo_id
from     promotions
order by promo_id
limit    2)
limit 2
;


The final result:

promo_id  |expiry_date
----------|--------------------
   5      | 01.01.2017 00:00:00
   1      | 01.01.2017 00:00:00


Using you query

(SELECT `promo_id` 
 FROM `promotions` 
 WHERE (`expiry_date` &gt;= '2017-03-21' AND `promo_id` &gt; (SELECT `promo_id`  FROM `promoted_questions` WHERE `promo_id` = 8))
 ORDER BY `promo_id` ASC
 LIMIT 2
)
UNION ALL
(SELECT `promo_id`
 FROM `promoted_questions`
 ORDER BY `promo_id` ASC
 LIMIT 2
)
LIMIT 2;