Just use the look-ahead, (?!pattern)
#include <iostream>
#include <string>
#include <boost/regex.hpp>
int main()
{
std::string str = "This is a link [[abcd 1234|xyz 1234]] [[India]] [[abcd 1234|xyz 1234]]";
boost::regex re("\\[\\[(((?!\\]\\]).)+)\\|.*?]]");
std::cout << boost::regex_replace(str, re, "$1") << '\n';
}