Why is a query with a join and limit clause running so slow, even using a covering index?
Even if both tables have the appropriate indexes on A.id and A_id you still may need an index on B.value to get decent performance.  I've reformatted your query for readability. 

SELECT  B.A_id 
FROM    B 
JOIN    A 
ON      B.A_id = A.id 
WHERE   B.value IS NULL 
LIMIT   1000;


It appears that A_id is a foreign key for a many to one relationship from B to A.  If that is the case we don't need to reference table A as A_id will be NOT NULL if the tables would join. 

SELECT  B.A_id 
FROM    B 
WHERE   B.value IS NULL 
AND     A_id IS NOT NULL
LIMIT   1000;


If B.value is rarely NULL you may not 1000 records in B that where B.value is NULL.  You can count the records, but not get a distribution of the records with the query. 

SELECT  COUNT(1) 
FROM    B 
WHERE   B.value IS NULL;


An index on B.value would likely speed up the query.  A limit of 1000 is significantly larger than I have used on a production system.   Try the query with smaller limits like 1, 2, 5, 10, 20, 50 or 100.

Problems with query performance are best investigated with an EXPLAIN PLAN of the query.  This will tell you how the database is executing the query.  I've seen the optimizer choose rather strange plans, usually providing better performance than the plan I expected.  Rarely, the optimizer will choose a really bad plan.  Without the right indexes and statistics, the optimizer may not be able to generate a plan the performs well.